在这个示例代码中,为什么不是
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,而不是尝试复制对象。
为什么不使用 IParameterBase::operator=;工作,基类赋值运算符工作吗?相反,它试图复制该对象。
因为当您编写
param1 = param2
时,您将 param2
传递给赋值 operator=
的参数,并且 param2
的类型为 ParameterTx<uint16_t>
,因此 只有删除的复制赋值运算符= 是候选者,因为由 using IParameterBase<TYPE>::operator=;
购买的参数类型为 const uint16_t value
。
由于基类有一个 const 成员,复制赋值运算符被删除,因此我们遇到了上述错误。