在模板中使用"+"运算符添加模板类和参数类时出现错误 C2679
Error C2679 when using '+' operator in a template to add template class and parameter class
我试图创建一个模板类,该类表示一组元素,该元素通过两种方式重载"+"运算符:像这样: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(); }
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 如何修复用于根据参数返回不同类型的模板类中的错误C2679?
- 在模板中使用"+"运算符添加模板类和参数类时出现错误 C2679