在模板中使用“+”运算符添加模板类和参数类时出现错误C2679

时间:2014-01-05 10:36:32

标签: c++ visual-studio templates operator-overloading

我正在尝试创建一个模板类,表示一组以两种方式重载'+'运算符的元素: 像这样:someNewSet = setA + setB; 并且:someNewSet = setA + newElement;

(我知道使用它是一种不好的做法,但请耐心等待。)

但是,我继续遇到后者的问题,可以通过这个例子显示:

foo.h中:

template<typename T>
class Foo {
private:
    T bar;
public:
Foo(T arg);
    template<typename TT> friend Foo<TT> operator + (Foo<TT>& a, Foo<TT>& b);
template<typename TT> friend Foo<TT> operator + (Foo<TT>& a, TT& element);
};

template<typename T>
Foo<T>::Foo(T arg) {
    bar = arg;
}

template<typename T>
Foo<T> operator + (Foo<T>& a, Foo<T>& b) {
        return Foo<T>(b.bar);
}

template<typename T>
Foo<T> operator + (Foo<T>& a, T& element) {
    return Foo<T>(element);
}

main.cpp中:

int main() {
    Foo<int> f(5);
    Foo<int> g(3);

    f + g;//works fine

    f + 5;//generates error

    system("PAUSE");
    return 0;
};

错误消息:

  

错误C2679:二进制'+':找不到带有'int'类型右手操作数的运算符(或者没有可接受的转换)[文件路径] /main.cpp [这里的项目名称]

此外,Visual Studio 2013中的构建输出窗口显示:

  

的main.cpp   [file-path] \ main.cpp(43):错误C2679:二进制'+':找不到带有'int'类型右手操作数的运算符(或者没有可接受的转换)

     [file path]\foo.h(27): could be 'Foo<int> operator +<int>(Foo<int> &,T &)'
     with
     [
         T=int
     ]
     while trying to match the argument list '(Foo<int>, int)'

尝试使用,例如,函数template<typename TT> friend Foo<TT> add (Foo<TT>& a, TT& element);会产生类似的结果。

我还尝试向前声明模板类和有问题的函数(并在参数列表之前添加<>),但这没有帮助。

我不会错过这里明显的东西,是吗?

1 个答案:

答案 0 :(得分:0)

你的问题可归结为:

struct Foo {};

Foo operator+(Foo&, int&) { return Foo(); }

int main()
{
  Foo f1;
  Foo f2 = f1 + 42;
}

您的参数是非const引用,并且您传递的参数不能绑定到这些参数(在我的示例中为42,在您的示例中为5)。您可以修复此操作,将操作员参数更改为const引用。这无论如何都是有道理的,因为二元运算符不应该真正改变它的操作数。上面的例子可以修改如下:

Foo operator+(const Foo&, const int&) { return Foo(); }