2015-12-09 27 views
5

私は私のC++コンパイラは次のコードと混同される理由を理解しようとしています:私はエラー:のためのあいまいなオーバーロード「演算子==」

$ 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> 

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; 
} 

コンパイルにつながりますoperator==

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

しかし、私がこの症状を解決できることを理解してください私が探しているのは、なぜenumを比較するのかという解釈は、classの中で行われたときにのみあいまいさにつながります。私はこの小さなenumラッパーを書いています。私のコードではC++ 03のみを使用する必要があるからです。

+3

'Enum'コンバートを**任意の**型にする演算子T()があります。それはあいまいさをたくさん招きます。 –

答えて

2

呼び出しがあいまいである。

どのようなタイプに変換されたのかは不明ですが、その演算子を削除するとコードworksとなります。

C++ 11を使用している場合は、代わりにscoped enumsを使用してください。

+0

私はどんなタイプの変換もしないように努力しました...私のコメントを参照してください – malat

+0

C++ 03でタイプセーフな列挙型が必要な場合は、暗黙のうちに基礎となるものに変換するのではなく、列挙型。 – TartanLlama

0

enumは暗黙的に(私はそれがCへの下位互換性によって引き起こされる理解限りintに変換することができます。スコープの列挙型は、intに暗黙の型変換を許可していませんので、あなたがこの問題を解決するためにenum classを使用することができますC++11を使用することができます。両方Enum::Typeintバージョンはoperator Type変換とoperator Tテンプレート変換演算子を使用して、後者を使用して、元の単一の暗黙的な変換と有効であるよう

0

Enumは、実装定義の整数型であり、ほとんどがintです。現在、enumのために実装する演算子は、タイプintの演算子を実装しているようなものです。 int,doublechar ...などの整数型のany演算子は、プログラミング言語自体の基本的な意味を変更するため、再定義することはできません。

関連する問題