[英]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
可以隱式轉換為int
(據我所知,它是由向后兼容C
引起的。如果你可以使用C++11
你可以使用enum class
來解決這個問題,因為作用域枚舉不允許隱式轉換為int
。
Enum
是實現定義的整數類型,主要是int
。 現在,您為enum
實現的任何運算符就像您正在為int
類型實現運算符。 並且不允許為整數類型(例如int
, double
, char
...)重新定義任何運算符,因為它將改變編程語言本身的基本含義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.