You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:41:06