对于模板化重载运算符,编译错误“找不到全局运算符”

时间:2015-05-07 12:43:38

标签: c++ templates compiler-errors

我已经定义了一个模板类和重载的运算符。编译时,我收到以下错误消息:

  

错误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的工作正常,也经过测试]。

我做错了什么?如何解决此错误?运算符已定义,只需几行。

2 个答案:

答案 0 :(得分:3)

假设必要的构造函数确实存在且工作正常,那么您发布的代码中的错误是

this += Class(x);

尝试修改不可变指针this的值。它应该是

*this += Class(x);

答案 1 :(得分:1)

我认为这两行都存在两个问题:

this += Class(x);

一:添加的对象应该是*this而不是this,因为后者是指针,而不是对象本身。

二:TClass没有转换构造函数。也就是说,您无法从Class<3>转换为Class<2>,因此Class(x)将无法编译。解决方案是添加它:

template<int other> Class(const Class<other> &o)
{}