我试图为一个2D表示向量的类定义“-=”和“-”,但我得到了这个错误:
vecteur2d.cc:131:7:错误:没有可行的重载“-=”VEC1-=VEC2;
Vecteur2D.cc:81:23: note: candidate function not viable: 'this' argument has
type 'const Vecteur2D', but method is not marked const
Vecteur2D& Vecteur2D::operator -= (const Vecteur2D& vec){
here is my code for the two operator:
Vecteur2D& Vecteur2D::operator -= (const Vecteur2D& vec){
x_=x_-vec.x_;
y_=y_-vec.y_;
return *this;
}
and:
const Vecteur2D operator +(const Vecteur2D& vec1, const Vecteur2D& vec2){
vec1+=vec2;
return vec1;
}
不能对const
实例调用非const方法。您的运算符-=
看起来还可以,但如果您尝试这样调用它:
const Vecteur2D x,y;
x -= y; // error
您将得到一个与您报告的错误类似的错误。-=
应该修改左操作数,而您的运算符-=
可以执行此操作。左操作数不能是const
。
您的运算符+=
也存在常量正确性问题:
const Vecteur2D operator +(const Vecteur2D& vec1, const Vecteur2D& vec2){
vec1+=vec2;
return vec1;
}
您不能修改vec1
,因为它是常量
。operator+
预期不会修改其操作数并返回新实例。您的运算符+
没有这样做。假设您有一个正确的+=
运算符+
可以写成:
Vecteur2D operator +(const Vecteur2D& vec1, const Vecteur2D& vec2){
Vecteur2D result = vec1; // non const copy
result += vec2;
return result;
}
要了解更多细节,我建议您了解操作符重载的基本规则和习惯用法是什么?
(附注:据我所知,以前认为返回const
值是很好的做法,尽管它会阻止move语义,不再推荐使用)