2011-03-04 14 views
55

Hola tengo archivos llamados MyCode.h y MyCode.cppMi enumeración no es una clase o espacio de nombres

En MyCode.h he declarado

enum MyEnum {Something = 0, SomethingElse = 1}; 

class MyClass { 

MyEnum enumInstance; 
void Foo(); 

}; 

Luego, en MyCode.cpp:

#include "MyCode.h" 

void MyClass::Foo() { 
    enumInstance = MyEnum::SomethingElse; 
} 

pero cuando se compila con g ++ consigo el error 'MyEnum' no es una clase o espacio de nombres ...

(funciona bien en la EM, pero no VS2010 linux g ++)

¿Alguna idea? Gracias Thomas

+1

Nota: en su archivo '.cpp', si desea proporcionar una implementación para' MyClass :: foo', la firma sería 'void MyClass :: Foo() {...} '. Te falta el bit 'MyClass ::'. – phooji

+0

MyCode.h! = MyClass.h ... Sin embargo, eso ayuda: P – dcousens

Respuesta

57

La sintaxis MyEnum::SomethingElse es una extensión de Microsoft. Resulta ser uno que me gusta, pero no es estándar C++. enum valores se añaden al espacio de nombres que rodea:

// header 
enum MyEnum {Something = 0, SomethingElse = 1}; 

class MyClass { 

MyEnum enumInstance; 
void Foo(); 

} 

// implementation 
#include "MyClass.h" 

void Foo() { 
    enumInstance = SomethingElse; 
} 
+7

Afortunadamente, C++ 0x agregará esa capacidad, una que creo que estuvo ausente durante bastante tiempo y muy necesaria. –

+1

Gracias. Me volvía loco. No pude entender por qué mis enums se resolverían en un proyecto XCode y no en el otro. O.o Aunque todavía no tengo una respuesta sobre por qué sucedió esto, sé cuál es la solución. Si alguien aventura una conjetura, estaría más que feliz de saber ... – javatarz

51

Las enumeraciones de alcance no existirán hasta C++ 0x. Por el momento, el código debe ser

enumInstance = SomethingElse; 

puede crear una artificial con ámbito de enumeración poniendo la definición de la enumeración dentro de su propio espacio de nombres o estructura.

29

De hecho, C++ 0x permite esa característica. Podría permitir que gcc con éxito en el uso de este indicador de línea de comando: -std = C++ 0x

Esta fue la versión de gcc 4.4.5

+1

Gracias, me ayudó a ahorrar el tiempo – karate

2

Como explican en otras respuestas: la sintaxis no es MyEnum::SomethingElse válido en las enumeraciones regulares de C++ 98 a menos que su compilador las soporte a través de extensiones no estándar.

Personalmente, no me gusta la declaración enum MyEnum {A, B}; porque el nombre del tipo no está presente al usar los valores enum. Esto puede generar conflictos de nombres en el espacio de nombre actual.

Por lo que el usuario debe consultar el nombre del tipo en cada valor enum. Ejemplo para evitar declarar A dos veces:

enum MyEnum {MyEnum_A, MyEnum_B}; 
void A(void) { 
    MyEnum enumInstance = MyEnum_A; 
} 

Prefiero usar un espacio o estructura de nombre específico. Esto permitirá hacer referencia a los valores de enumeración con el último estilo C++:

namespace MyEnum { 
    enum Value {A,B}; 
} 
void A(void) { 
    MyEnum::Value enumInstance = MyEnum::A 
} 
Cuestiones relacionadas