20

同じ列挙値を別々のタイプで再利用する方法はありますか?次のようなことができるようにしたいと思います。

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 ++コンパイラには意味がありません-それは文句を言います:error C2365: 'UNKNOWN' : redefinition; previous definition was 'enumerator'上記の2行目。これを行う正しい方法はありますか、それとも常に一意の列挙値を使用することになっていますか?他の誰かのコードを含めている場合、これが常に保証されるとは想像できません。

4

2 に答える 2

30

C ++ 11を使用している場合は、次を使用することをお勧めします。

enum class Foo

ただの代わりに:

enum Foo

これにより、名前空間と同様の構文と利点が得られます。あなたの場合、構文は次のようになります。

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

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

于 2014-05-29T20:17:57.707 に答える
25

namespace列挙型を:に含めることができ、含める必要があります。

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

//...

DeviceType::DeviceType x = DeviceType::UNKNOWN;
于 2012-05-02T09:50:04.947 に答える