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
相关产品推荐
相关产品推荐

