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

Error C2679 when using '+' operator in a template to add template class and parameter class

本文关键字:参数 C2679 错误 运算符 添加      更新时间:2023-10-16

我试图创建一个模板类,该类表示一组元素,该元素通过两种方式重载"+"运算符:像这样: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[文件路径]\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);会产生类似的结果。

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

我没有遗漏什么明显的东西,是吗?

您的问题可以归结为:

struct Foo {};
Foo operator+(Foo&, int&) { return Foo(); }
int main()
{
Foo f1;
Foo f2 = f1 + 42;
}

您的参数是非常量引用,并且您传递的参数不能绑定到这些参数(在我的示例中为42,在您的示例中是5)。将运算符参数更改为const引用可以解决此问题。无论如何,这是有道理的,因为二进制运算符不应该真正更改其操作数。上面的例子可以这样固定:

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