Мое перечисление не является классом или пространством имен
Привет У меня есть файлы с именем 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++)
Любые идеи?
благодаря
Томас
Ответы
Ответ 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
}