C++ enum class 出现 ambiguous overload for 'operator==' 错误原因及解决
错误产生原因
C++标准会为所有enum class类型自动生成内置的operator==运算符,其签名为operator==(A, A),采用按值传递参数的形式,默认按枚举的底层整数值做相等性比较。
你自定义的operator==(const A& a, const A& b)和内置运算符属于同等级的重载候选:当传入A::W这类纯右值作为参数时,右值既可以拷贝构造给值类型形参,也可以直接绑定到const左值引用形参,二者都是精确匹配,没有优先级差异。编译器进行重载决议时无法选出最优匹配,因此抛出重载歧义错误。
修复方案
- 方案1:无自定义比较需求时直接删除自定义的
operator==实现,直接使用编译器内置的默认比较逻辑即可满足常规使用需求。 - 方案2:若确实需要自定义比较逻辑,将自定义运算符的参数改为按值传递,和内置运算符签名对齐,此时用户自定义的重载会被优先匹配,示例代码如下:
enum class A { W }; bool operator==(A a, A b) { // 自定义比较逻辑 return true; } int main() { (A::W == A::W); // 编译正常 }
- 方案3:若使用C++20及以上版本,可将自定义运算符定义为枚举类的友元,也可以避免歧义:
enum class A { W, friend bool operator==(const A& a, const A& b) { return true; } }; int main() { (A::W == A::W); // 编译正常 }
内容的提问来源于stack exchange,提问作者XTEkX ds
相关产品推荐
相关产品推荐

