簡體   English   中英

錯誤:'operator =='的模糊重載

[英]error: ambiguous overload for ‘operator==’

我試圖理解為什么我的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==來解決症狀operator==

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

但實際上我正在尋找的是解釋為什么只有當它在一個class完成時,比較enum才會導致歧義。 我寫了這個小的枚舉包裝,因為我只需要在我的代碼中使用C ++ 03。

調用是不明確的,因為Enum::Typeint版本都是有效的,只有一個隱式轉換,前者使用operator Type轉換,后者使用operator T模板轉換運算符。

目前還不清楚為什么要轉換為任何類型,但如果刪除該運算符,則代碼可以正常工作

如果您使用的是C ++ 11,則應使用作用域枚舉

enum可以隱式轉換為int (據我所知,它是由向后兼容C引起的。如果你可以使用C++11你可以使用enum class來解決這個問題,因為作用域枚舉不允許隱式轉換為int

Enum是實現定義的整數類型,主要是int 現在,您為enum實現的任何運算符就像您正在為int類型實現運算符。 並且不允許為整數類型(例如intdoublechar ...)重新定義任何運算符,因為它將改變編程語言本身的基本含義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM