You need to enable JavaScript to run this app. C++重载==运算符后仍报binary == no operator found错误怎么解决
优惠活动
大模型
产品
解决方案
定价
更多

C++重载==运算符后仍报binary == no operator found错误怎么解决

问题原因与解决方法

报错根因

  • 你编写的operator==是非const成员函数,C++语法规定非const成员函数不允许被const类型的对象调用。由于FindIndex是ViewPortObjectContainer的const成员函数,函数内部访问的objects容器内所有元素都会被视为const PhysicsVertex类型,std::find执行相等比较时左操作数为const类型,找不到匹配的运算符实现,因此抛出编译错误。
  • 此前remove-erase惯用法可正常运行,是因为你当时操作的是没有const修饰的容器,元素无const限制,非const的operator==可以正常调用。
  • 新增传值版本的operator==后出现二义性错误,是因为调用时两个重载的参数匹配优先级完全相同,编译器无法选择最优实现。

修复方案

第一步:修复运算符const属性

将PhysicsVertex的operator==声明为const成员函数,允许在const对象上调用:

class PhysicsVertex 
{
public:
    // 参数列表末尾添加const,标识该成员函数不会修改当前对象
    bool operator==(const PhysicsVertex& other) const
    {
        return this == &other;
    }
};

修改后即可解决编译报错问题。

第二步:修复逻辑匹配问题

你当前的operator==实现是比较两个对象的内存地址,但你调用Push方法时执行的是值拷贝,vector中存储的是传入对象的副本,和你外部传入FindIndex的原对象地址完全不同,编译通过后运行时也会找不到匹配元素,返回值等于容器的长度。
可根据你的需求选择修改方向:

  • 若需要按对象地址匹配:将容器声明改为std::vector<PhysicsVertex*>,调用Push时传入对象地址,比较逻辑保持不变即可。
  • 若需要按对象内容匹配:修改operator==的实现,比较类内的成员属性而非对象地址。

内容的提问来源于stack exchange,提问作者user16038533

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 23:12:03