Мое перечисление не является классом или пространством имен


Привет у меня есть файлы под названием MyCode.h И MyCode.cpp

В MyCode.h я объявил

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

class MyClass {

MyEnum enumInstance;
void Foo();

}; 

затем в MyCode.cpp:

#include "MyCode.h"

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

но при компиляции с g++ я получаю ошибку "MyEnum" не является классом или пространством имен...

(отлично работает в MS VS2010, но не linux g++)

какие идеи? Спасибо Томас

4 57

4 ответа:

синтаксис MyEnum::SomethingElse является расширением Microsoft. Это тот, который мне нравится, но это не стандартный C++. enum значения добавляются в окружающее пространство имен:

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

 class MyClass {

 MyEnum enumInstance;
 void Foo();

 }

 // implementation
 #include "MyClass.h"

 void Foo() {
     enumInstance = SomethingElse;
 }

ограниченных перечислений не будет существовать до С++0х. На данный момент, ваш код должен быть

enumInstance = SomethingElse;

вы можете создать искусственное перечисление с областью видимости, поместив определение перечисления в собственное пространство имен или структуру.

действительно, C++0x позволяет эту функцию. Я мог бы включить его успешно в gcc, используя этот флаг командной строки: - std=c++0x

Это было с GCC версии 4.4.5

как объясняют в других ответах: синтаксис MyEnum::SomethingElse недопустимо для обычных перечислений C++98, если ваш компилятор не поддерживает их через нестандартные расширения.

мне лично не нравится декларация enum MyEnum {A, B}; потому что имя типа отсутствует при использовании значений перечисления. Это может привести к конфликту имен в текущем пространстве имен.

поэтому пользователь должен ссылаться на имя типа в каждом значении перечисления. Пример, чтобы избежать объявления дважды:

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

Я предпочитаю используйте определенное пространство имен или структуру. Это позволяет ссылаться на значения перечисления с последним стилем C++:

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