我正在尝试创建一个模板类,表示一组以两种方式重载'+'运算符的元素:
像这样: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);
会产生类似的结果。
我还尝试向前声明模板类和有问题的函数(并在参数列表之前添加<>
),但这没有帮助。
我不会错过这里明显的东西,是吗?
答案 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(); }