我试图为我的课程覆盖operator+
和operator=
。这是我的代码:
#include <iostream>
#include <vector>
using namespace std;
class Integer {
public:
int i;
Integer operator+ (Integer&);
Integer& operator= (Integer&);
};
Integer Integer::operator+(Integer& rhs) {
Integer res;
res.i = this->i + rhs.i;
return res;
}
Integer& Integer::operator=(Integer& rhs) {
this->i = rhs.i;
return *this;
}
int main()
{
Integer i1, i2, i3;
i1.i = 1, i2.i = 2;
i3 = i1 + i2;
cout << i3.i;
}
在Visual Studio 2017中,编译器抱怨说:
"E0349 no operator "=" matches these operands"
似乎Integer
对象与Integer&
函数中的operator=
不匹配。但它适用于operator+
功能。这非常令人困惑。
非常感谢。
i3 = i1 + i2;
返回Integer
类型的临时变量。
现在,你的operator=
需要一个Integer&
。这是对Integer
的引用。问题是临时工具不能绑定到非const引用。
只要确保你改为const Integer&
。这是所有运算符重载的默认值。
我将从赋值声明中删除它。
i3 = i1 + i2;
首先发生的是添加表达式得到评估。这是这段代码:
i1 + i2
您设计了运算符重载来处理此表达式。您的自定义加法运算符重载返回一个新的Integer
实例。但是当您尝试将此新实例分配给赋值重载中的参数时,会出现此问题。这是该代码的片段。
Integer& Integer::operator=(Integer& rhs);
在函数声明中使用引用参数时,编译器会检查以确保此值不是临时值,以便在调用函数后它将存在。编译器已(确切地)确定传递给此赋值语句的参数是临时值。这就是为什么当你尝试这样做时它会吐出错误的原因。
我认为使代码有意义的最合理的原因是实现以下内容:
Integer& Integer::operator=(const Integer& rhs) {
this->i = rhs.i;
return *this;
}
通过添加const-specifier,您可以告诉编译器在调用函数后,您不依赖于rhs
来保持存在。在这种情况下,传递给参数的值可以是临时值。