2012-05-02 60 views
13

別々の型で同じ列挙型の値を再利用する方法はありますか?私は次のようなものにできるようにしたいと思います:上記の2行目にerror C2365: 'UNKNOWN' : redefinition; previous definition was 'enumerator'を:列挙型の値を別々の列挙型で再利用

enum DeviceState { UNKNOWN, ACTIVE, DISABLED, NOTPRESENT, UNPLUGGED }; 
enum DeviceType { UNKNOWN, PLAYBACK, RECORDING }; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DeviceState deviceState = DeviceState::UNKNOWN; 
    DeviceType deviceType = DeviceType::UNKNOWN; 
    return 0; 
} 

これは私にではなく、C++に理にかなって、それは文句を言いcompiler-。これを行う正しい方法がありますか、またはいつも一意の列挙値を使用するはずですか?私は他人のコードを含めているかどうかを保証することが常に可能であるとは想像できません。

答えて

15

あなたがすることができ、かつ、namespaceであなたの列挙型を含める必要がありますC++ 11を使用してそれらのために

namespace DeviceState 
{ 
    enum DeviceState{ UNKNOWN, ACTIVE, DISABLED, NOTPRESENT, UNPLUGGED }; 
} 
namespace DeviceType 
{ 
    enum DeviceType{ UNKNOWN, PLAYBACK, RECORDING }; 
} 

//... 

DeviceType::DeviceType x = DeviceType::UNKNOWN; 
+0

ありがとうございました。私のために私の例を修正することができますか?上記のように名前空間を使って変数を宣言する方法がわかりません。 –

+0

@IAmAI投稿したコードがうまくいきませんか? –

+0

変数を 'DeviceState deviceState = DeviceState :: UNKNOWN;'と宣言すると、コンパイラエラーが発生します。 '' DeviceState ':式の名前空間識別子の不正使用 ' –

20

を、あなたが使用することを好むことがあります。

enum class Foo 

だけではなく:

enum Foo 

これは、名前空間と同様の構文と利点を提供します。あなたのケースでは、構文は次のようになります。

enum class DeviceState { UNKNOWN, ACTIVE, DISABLED, NOTPRESENT, UNPLUGGED }; 
DeviceState deviceState = DeviceState::UNKNOWN; 

注手動でint型(または何か他)にそれらをキャストする必要がありますので、これは強く型付けされていること。