2012-05-02 9 views
13

¿Hay alguna forma de reutilizar el mismo valor enum en tipos separados? Me gustaría ser capaz de algo así como lo siguiente:Reutilizando valores de enum en tipos de enumeración separados

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

Esto tiene sentido para mí, pero no hasta el C++ compiler- se queja: error C2365: 'UNKNOWN' : redefinition; previous definition was 'enumerator' en la línea 2 de los anteriores. ¿Hay una forma correcta de hacerlo, o se supone que siempre debo usar valores enum únicos? No me puedo imaginar que esto siempre sea posible para garantizar si incluyo el código de otra persona.

Respuesta

15

se puede, y debe, incluir sus enumeraciones en una namespace:

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

//... 

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

Gracias Luchian. Por favor, podrías corregir mi ejemplo por mí. No estoy seguro de cómo declarar una variable usando espacios de nombres como describió anteriormente. –

+0

@IAmAI, ¿entonces el código que publiqué no funciona? –

+0

Si declaro una variable como 'DeviceState deviceState = DeviceState :: UNKNOWN;', obtengo un error de compilación: ''DeviceState': uso ilegal del identificador de espacio de nombres en la expresión' –

20

Para aquellos que utilizan C++ 11, es posible que prefiera utilizar:

enum class Foo 

en lugar de simplemente:

enum Foo 

Esto proporciona sintaxis y beneficios similares como espacios de nombres. En su caso, la sintaxis sería:

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

cuenta que este es fuertemente tipado por lo que necesitará para fundir manualmente para enteros (o cualquier otra cosa).