【问题标题】:error: ambiguous overload for ‘operator==’错误:'operator==' 的重载不明确
【发布时间】:2025-12-09 19:10:02
【问题描述】:

我试图理解为什么我的 c++ 编译器会与以下代码混淆:

struct Enum
{
  enum Type
  {
    T1,
    T2
  };
  Enum( Type t ):t_(t){}
  operator Type () const { return t_; }
private:
  Type t_;
    // prevent automatic conversion for any other built-in types such as bool, int, etc 
  template<typename T> operator T () const;
};

  enum Type2
  {
    T1,
    T2
  };

int main()
{
  bool b;
  Type2 e1 = T1;
  Type2 e2 = T2;
  b = e1 == e2;

  Enum t1 = Enum::T1;
  Enum t2 = Enum::T2;
  b = t1 == t2;
  return 0;
}

编译导致:

$ c++ enum.cxx
enum.cxx: In function ‘int main()’:
enum.cxx:30:10: error: ambiguous overload for ‘operator==’ (operand types are ‘Enum’ and ‘Enum’)
   b = t1 == t2;
          ^
enum.cxx:30:10: note: candidates are:
enum.cxx:30:10: note: operator==(Enum::Type, Enum::Type) <built-in>
enum.cxx:30:10: note: operator==(int, int) <built-in>

我知道我可以通过提供明确的operator== 来解决问题:

  bool operator==(Enum const &rhs) { return t_ == rhs.t_; }

但我真正想要的是解释为什么只有在class 内比较enum 才会导致模棱两可。我编写了这个小型枚举包装器,因为我的代码中只需要使用 C++03。

【问题讨论】:

  • 您有一个 operator T () 使 Enum 可转换为 any 类型。这会引起很多歧义。

标签: c++ comparison operators


【解决方案1】:

调用不明确,因为Enum::Typeint 版本都对单个隐式转换有效,前者使用operator Type 转换,后者使用operator T 模板转换运算符。

不清楚为什么要转换为任何类型,但如果删除该运算符,代码works

如果您使用的是 C++11,则应使用 scoped enums

【讨论】:

  • 我努力转换成任何类型...查看我的评论
  • 如果你想要 C++03 中的类型安全枚举,最好自己提供所有运算符,而不是隐式转换为底层枚举。
【解决方案2】:

Enum 是实现定义的整数类型,主要是int。现在,您为enum 实现的任何运算符就像您正在为类型int 实现运算符一样。并且不允许为 intdoublechar 等整数类型重新定义 any 运算符,因为这会改变编程语言本身的基本含义。

【讨论】:

    【解决方案3】:

    enum 可以隐式转换为int(据我了解,这是由于向后兼容C 造成的。如果可以使用C++11,则可以使用enum class 来解决此问题,因为作用域枚举不允许隐式转换为int

    【讨论】:

      最近更新 更多