2009-01-14 10 views
6

En this question, hay que an answer Unidos:Operador de resolución de alcance en enumeraciones ¿una extensión específica del compilador?

Puede utilizar typedef para hacer accesibles Color tipo de enumeración sin especificar que es "nombre completo".

typedef Sample::Colour Colour; 
Colour c = Colour::BLUE; 

Eso suena correcto para mí, pero alguien abajo votó y dejó este comentario:

Usando el operador de resolución de alcance :: en las enumeraciones (como en "Color :: AZUL") es una extensión específica del compilador, no estándar C++

¿Es eso cierto? Creo que lo he usado tanto en MSVC como en GCC, aunque no estoy seguro de eso.

Respuesta

7

He probado el siguiente código:

enum test 
{ 
    t1, t2, t3 
}; 

void main() 
{ 
    test t = test::t1; 
} 

Visual C++ 9 compilado con la siguiente advertencia:

C4482 advertencia: la extensión no estándar utilizado: enum 'prueba' se utiliza en cualificado nombre

No parece que sea estándar.

+0

Hm, tienes razón. Ahora que lo pienso, lo que he usado es el equivalente a 'Sample :: BLUE', no' Color :: BLUE'. Gracias. –

+3

Nota: no es estándar para C++ 98. Es estándar en C++ 11. –

3

En C++ estándar, las cosas a la izquierda de "::" deben ser una clase o espacio de nombres, las enumeraciones no cuentan.

+3

... o struct o union. –

0

Lo que puede hacer para evitarlo es crear un espacio de nombres con el mismo nombre que la enumeración. Eso efectivamente agregará los valores de enumeración en su propio ámbito y puede usar el nombre de la enumeración/espacio de nombres para referirse a ellos. Por supuesto, solo funciona para enumeraciones que de otro modo existirían en el alcance global (u otro espacio de nombres).

También hay un artículo sobre este tema en alguna parte.

8

Eso no es estándar.

En C++ 11, podrá hacer enumeraciones de ámbito con una declaración enum class.

Con compiladores pre-C++ 11, para determinar el alcance de una enumeración, deberá definir la enumeración dentro de una estructura o espacio de nombres.

+3

Nota: en C++ 11, también puede usar scoping para non-'class' 'enum's. Simplemente no * tiene * para alcanzar el alcance de la forma en que lo hace con 'clase enum'. –

Cuestiones relacionadas