请考虑以下代码:
#include <iostream>
using namespace std;
class vec {
public:
float x,y;
vec(float a, float b) {
x = a;
y = b;
}
const vec operator + (const vec & a) {
vec ResVec(0.0f, 0.0f);
ResVec.x = x + a.x;
ResVec.y = y + a.y;
return ResVec;
}
};
vec foo(const vec& v1, const vec& v2)
{
const vec temp(2.0f,2.0f);
return v1 + v2 + temp;
}
int main() {
vec v1(1.0f, 1.0f);
vec v2(2.0f,2.0f);
vec v3(0.0f,0.0f);
v3 = foo(v1,v2);
}我想用常量输入参数实现函数foo。但是我失败了,因为编译器说: error: no match for‘operator+’(操作数类型是‘const vec’和‘const vec’)返回v1 + v2 + temp。如何修改运算符重载,以便在函数中使用+运算符
vec foo(const vec& v1, const vec& v2)
发布于 2019-12-02 05:41:48
const vec operator + (const vec & a) {这个重载返回一个const vec。不是vec。这事很重要。
v1 + v2 + temp;因此,第一个加法运算符返回一个const vec。第二个加法运算符将尝试将const vec添加到vec。但是,重载不是const类方法,因此不能为const对象调用它(这不是100%技术上的准确解释,见下文,但在本例中更容易理解)。
只需将重载更改为:
const vec operator + (const vec & a) const {这就是它应该成为的样子,因为它不会修改this中的任何内容。这个重载必须是const类方法还有其他原因;在本例中,考虑到返回const vec的事实,更容易理解其中的原因。您也可以将此重载声明为返回vec而不是const vec,但这并不是什么大问题(由于不同的原因,同样的编译错误也会发生)。
在声明运算符重载时,以下经验法则适用:如果重载的运算符没有修改this中的任何内容,则必须将其声明为const类方法。
https://stackoverflow.com/questions/59130210
复制相似问题