我已经定义了一个模板类和重载的运算符。编译时,我收到以下错误消息:
错误C2677:二进制'+ =':找不到类型为'Class'的全局运算符(或者没有可接受的转换)
以下是该课程的相关代码:
template<int foo>
class Class
{
private:
int value;
public:
template<int other_foo>
friend class Class;
// Constructors and copy constructors for several data type
// including other possibilities of "foo"; all tested.
Class& operator+=(const Class& x)
{
value += x.value;
return *this;
}
template<class T>
Class& operator+=(const T& x)
{
this += Class(x);
return *this;
}
};
如果我创建了两个对象,例如Class<3>
; operator +=
工作得很好并做正确的事。
但是,如果我有一个Class<3>
和Class<2>
之一的对象,我得到上面的错误,该错误指向为T [不同值的构造函数定义“+ =”的行foo的工作正常,也经过测试]。
我做错了什么?如何解决此错误?运算符已定义,只需几行。
答案 0 :(得分:3)
假设必要的构造函数确实存在且工作正常,那么您发布的代码中的错误是
this += Class(x);
尝试修改不可变指针this
的值。它应该是
*this += Class(x);
答案 1 :(得分:1)
我认为这两行都存在两个问题:
this += Class(x);
一:添加的对象应该是*this
而不是this
,因为后者是指针,而不是对象本身。
二:T
到Class
没有转换构造函数。也就是说,您无法从Class<3>
转换为Class<2>
,因此Class(x)
将无法编译。解决方案是添加它:
template<int other> Class(const Class<other> &o)
{}