2012-06-03 12 views
12

列挙型C++で同じ名前の2つの列挙型の名前の競合を避けるにはどうすればよいですか?あなたはこのような二つの異なる列挙型で1名を持つことはできません:一つの大きな問題を抱えているC++で

enum Browser 
{ 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
} 

enum OS 
{ 
    None = 0, 
    XP = 1, 
    Windows7 = 2 
} 

したがって、この例では、この問題に対処するための最良の方法は何ですか?

+1

列挙型がクラスに固有の場合は、その列挙型をクラスの(パブリックセクション内に)配置し、次に例を参照してください。 ClassName :: NoneおよびOtherClassName :: None。列挙型を名前空間に代入することもできます。純粋なCで名前空間を指定する典型的な方法は、各列挙された識別子へのプレフィックス経由です。 – pmdj

+0

私の質問http://stackoverflow.com/questions/12972317/count-on-enum-c-automaticあなたの質問に答えます。 – sergiol

+0

C++ 11のenumクラスは良い試みであるようです。しかし、 '|'を適用した後にキャストする必要があります。 – bytecode77

答えて

27

をあなたはstructenumを囲むことができます:C++ 11では

struct Browser 
{ 
    enum eBrowser 
    { 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
    }; 
}; 

は、それがenum classます

enum class Browser 
{ 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
}; 

In C++ 03 namespace als oはラップすることができますが、namespaceがより広範であるため、個人的にはstruct/classの方がラッピングされています。例えば

// file1.h 
namespace X 
{ 
    enum E { OK }; 
} 

// file2.h 
namespace X 
{ 
    enum D { OK }; 
} 
+0

なぜ 'struct'ではなく' namespace'ですか? – Pubby

+1

@Pubby、 'namespace'でもOKですが、' 'struct /' class''は ''哲学的に '' enum class'とより互換性があります。 – iammilind

+4

@Pubby: 'struct'でテンプレートを特殊化することができます。 –

3

のどちらかの名前空間やクラスでそれらをラップ:C++ 03では

namespace Browser { 
    enum BrowserType 
    { 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
    } 
} 

namespace OS { 
    enum OSType { 
     None = 0, 
     XP = 1, 
     Windows7 = 2 
    } 
} 
12

1つのオプションは、別の名前空間内の各列挙型を置くことです:使用することです、あなたのコンパイラで利用可能な場合、

namespace Foo { 
    enum Browser { 
     None = 0, 
     Chrome = 1, 
     Firefox = 2 
    } 
} 

namespace Bar { 
    enum OS { 
     None = 0, 
     XP = 1, 
     Windows7 = 2 
    } 
} 

良いオプションC++ 11 enum classes

enum class Browser { ... } 
enum class OS { ... } 

enumクラスについては、hereを参照してください。

1

範囲指定されていない列挙型と列挙されていない列挙型はどうですか? C++ 11では、スコープ付き列挙を提供しています。たとえば、

enum class Browser : <type> { 

}; 

enum class OS : <type> { 

}; 

ブラウザのオブジェクトまたはOSのオブジェクトを介して列挙型にアクセスします。

2

C++ 11でサポートされているenum classscoped enums)を使用できます。強く型付けされ、それぞれenumタイプが異なることを示します。

Browser::None != OS::None 

enum class Browser 
{ 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
} 

enum class OS 
{ 
    None = 0, 
    XP = 1, 
    Windows7 = 2 
} 
関連する問題