当前位置: 首页 > 知识库问答 >
问题:

重新定义运算符后没有可行的重载“-=”

东方建修
2023-03-14

我试图为一个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;
}


共有1个答案

葛成济
2023-03-14

不能对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语义,不再推荐使用)

 类似资料:
  • 所以为了我的目的,我遵循了这个SO答案,我真的不知道如何解决这个错误。当我试图访问或时,下面的错误出现了。查找互联网对我没有帮助。

  • 前面章节介绍了 Python 中的各个序列类型,每个类型都有其独特的操作方法,例如列表类型支持直接做加法操作实现添加元素的功能,字符串类型支持直接做加法实现字符串的拼接功能,也就是说,同样的运算符对于不同序列类型的意义是不一样的,这是怎么做到的呢? 其实在 Python 内部,每种序列类型都是 Python 的一个类,例如列表是 list 类,字典是 dict 类等,这些序列类的内部使用了一个叫作

  • java运算符"的含义是什么-

  • Rust可以让我们对某些运算符进行重载,这其中大部分的重载都是对std::ops下的trait进行重载而实现的。 重载加法 我们现在来实现一个只支持加法的阉割版复数: use std::ops::Add; #[derive(Debug)] struct Complex { a: f64, b: f64, } impl Add for Complex { type Outpu

  • 我在C#中定义了一个类(称为类A),并为它重载了一些算术运算符。让我们关注加法运算符(尽管我希望其他运算符的行为类似)。我已经设置了类A,这样我就可以向它添加标量(即单个Double值),我可以将它添加到标量中,或者我可以将A的两个实例一起添加。 所以在C#中,我用三个不同的签名重载了“”运算符。显式签名是: 一个双人间 < li >双A 答:答:答 当我在PowerShell中使用该类时,它只识