C++中“no viable overloaded =”错误的原因及修复方案
const成员函数中赋值报错的原因与修复
class Gebot{ string name; int betrag; public: Gebot(string name, int betrag = 100) : name{name} , betrag{betrag} { //ganze Zahl >0 und <=10.000.000 if(name.size() ==0 || betrag <=0 || betrag > 10000000) throw runtime_error("illegal name or deposite"); } bool selbe_bieterin(const Gebot& gebot) const{ if(gebot.name == this->name) return true; return false; } bool operator==(const Gebot& gebot) const{ name = "name"; // 此处触发编译报错 if(gebot.betrag == this->betrag) return true; return false; } bool operator<(const Gebot& gebot) const{ if(gebot.betrag > this->betrag) return true; return false; } bool operator>=(int gebot) const{ if(gebot <= this->betrag) return true; return false; } friend ostream& operator<<(ostream& o, const Gebot & gebot){ //[Susi: 263 Euro] o<<"["<<gebot.name<<": "<<gebot.betrag<<" Euro]"; return o; } };
在operator==这个const成员函数中执行name = "name";语句时,出现编译错误:
25:10: error: no viable overloaded '='
错误原因
- const成员函数的核心特性是无法修改当前对象的成员变量,此时
this指针的类型为const Gebot*,类的非static成员变量会被自动视为const属性。 - 这里的
name是string类型,在const成员函数中会被当作const string。而string的赋值运算符operator=是一个非const成员函数,const对象无法调用非const成员函数,因此触发了该报错。 - 额外说明:这条赋值语句本身完全不符合
operator==的语义——相等比较函数不应该修改任何参与比较的对象,属于无意义的误写。
修复方法
- 最直接且正确的修复:删除
name = "name";这条语句,让operator==专注于比较逻辑(当前代码仅比较betrag,若需要完整的相等判断,可补充对name的比较)。 - 若确实有在函数中修改成员变量的需求(本场景不适用),可以去掉函数后的
const修饰符,但这会破坏const正确性,导致const对象无法调用该函数,不推荐这种做法。
内容的提问来源于stack exchange,提问作者OrneFixe
相关产品推荐
相关产品推荐

