我正在尝试覆盖我的课程的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+
函数。这很令人困惑。
非常感谢。
答案 0 :(得分:3)
i3 = i1 + i2;
返回类型为Integer
的临时变量。
现在,您的operator=
需要一个Integer&
。这是对Integer
的引用。问题在于临时对象无法绑定到非常量引用。
只需确保您更改为const Integer&
。无论如何,这是所有运算符重载的默认值。
答案 1 :(得分:2)
我将在赋值语句中对此进行细分。
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
来持久存在。在这种情况下,传递给该参数的值可能是一个临时值。