Мое перечисление не является классом или пространством имен
Привет у меня есть файлы под названием 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 ответа:
синтаксис
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 }