重新定义运算符后没有可行的重载“-=”
No viable overloaded '-=' after redefining operators
我正在尝试为表示二维矢量的 class 定义“-=”和“-”,但出现此错误:
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
实例上调用非常量方法。您的 operator-=
看起来不错,但如果您尝试这样称呼它:
const Vecteur2D x,y;
x -= y; // error
您收到与您报告的错误类似的错误。 -=
预计会修改左操作数,而您的 operator-=
会这样做。左操作数不能是 const
.
您的 operator+=
也存在常量正确性问题:
const Vecteur2D operator +(const Vecteur2D& vec1, const Vecteur2D& vec2){
vec1+=vec2;
return vec1;
}
您不能修改 vec1
,因为它是 const
。 operator+
预计 不会 修改其操作数和 return 一个新实例。你的 operator+
不是 那样做。假设你有一个正确的 +=
,operator+
可以写成:
Vecteur2D operator +(const Vecteur2D& vec1, const Vecteur2D& vec2){
Vecteur2D result = vec1; // non const copy
result += vec2;
return result;
}
更多详情请参考What are the basic rules and idioms for operator overloading?
(PS:据我所知,以前 return const
值被认为是好的做法,尽管它会阻止移动语义并且不再推荐)
我正在尝试为表示二维矢量的 class 定义“-=”和“-”,但出现此错误:
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
实例上调用非常量方法。您的 operator-=
看起来不错,但如果您尝试这样称呼它:
const Vecteur2D x,y;
x -= y; // error
您收到与您报告的错误类似的错误。 -=
预计会修改左操作数,而您的 operator-=
会这样做。左操作数不能是 const
.
您的 operator+=
也存在常量正确性问题:
const Vecteur2D operator +(const Vecteur2D& vec1, const Vecteur2D& vec2){
vec1+=vec2;
return vec1;
}
您不能修改 vec1
,因为它是 const
。 operator+
预计 不会 修改其操作数和 return 一个新实例。你的 operator+
不是 那样做。假设你有一个正确的 +=
,operator+
可以写成:
Vecteur2D operator +(const Vecteur2D& vec1, const Vecteur2D& vec2){
Vecteur2D result = vec1; // non const copy
result += vec2;
return result;
}
更多详情请参考What are the basic rules and idioms for operator overloading?
(PS:据我所知,以前 return const
值被认为是好的做法,尽管它会阻止移动语义并且不再推荐)