Подтвердить что ты не робот

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

Привет У меня есть файлы с именем 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++)

Любые идеи? благодаря Томас

4b9b3361

Ответ 1

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

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

 class MyClass {

 MyEnum enumInstance;
 void Foo();

 }

 // implementation
 #include "MyClass.h"

 void Foo() {
     enumInstance = SomethingElse;
 }

Ответ 2

Скопированные перечисления не будут существовать до С++ 0x. Пока что ваш код должен быть

enumInstance = SomethingElse;

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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