使用基类运算符=重载而不是构建

问题描述 投票:0回答:1

在这个示例代码中,为什么不是

using IParameterBase<TYPE>::operator=;
工作,基类赋值运算符工作吗?

我最近更改为这个模板化版本,之前我已经编写了此机制起作用的单独类型类。

#include <cstdint>
#include <cstddef>
    
    class IParameter
    {
    public:
        explicit IParameter(const size_t size) : size_{size} {};
        virtual ~IParameter() = default;

        virtual void copy(uint8_t*& addr) = 0;
    private:
        const size_t size_;
    };

    template <class TYPE>
    class IParameterBase : public IParameter
    {
    public:
        explicit IParameterBase(const TYPE value) : IParameter{sizeof(TYPE)}, value_{value} {};
        ~IParameterBase() = default;

        virtual void update(const TYPE value) = 0;

        operator auto() const {return get();};

        TYPE operator= (const TYPE value) { update(value); return get(); };

        TYPE get() const {return value_;};

        protected:
        TYPE value_;
    };

    template <class TYPE>
    class ParameterTx : public IParameterBase<TYPE>
    {
    public:
        explicit ParameterTx(const TYPE value) : IParameterBase<TYPE>{value} {};

        using IParameterBase<TYPE>::operator=;

        void copy(uint8_t*& addr) override
        {
            /* copy stuff */
        }
        void update(const TYPE value) override
        {
            this->value_ = value;
        }
    };


int main ()
{
    ParameterTx<uint16_t> param1{0};
    ParameterTx<uint16_t> param2{1};

    param1 = 16;
    param2 = 5;

    param1 = param2;
}

代码在这里: https://godbolt.org/z/3vqd4ebYM

我希望底部的赋值解析为 uint16_t,而不是尝试复制对象。

c++ templates inheritance operator-overloading
1个回答
0
投票

为什么不使用 IParameterBase::operator=;工作,基类赋值运算符工作吗?相反,它试图复制该对象。

因为当您编写

param1 = param2
时,您将
param2
传递给赋值
operator=
的参数,并且
param2
的类型为
ParameterTx<uint16_t>
,因此 只有删除的复制赋值运算符= 是候选者,因为由
using IParameterBase<TYPE>::operator=;
购买的参数类型为
const uint16_t value

由于基类有一个 const 成员,复制赋值运算符被删除,因此我们遇到了上述错误。

© www.soinside.com 2019 - 2024. All rights reserved.