Мое перечисление не класс или пространство имен - PullRequest
59 голосов
/ 04 марта 2011

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

Есть идеи? Спасибо Thomas

Ответы [ 4 ]

63 голосов
/ 04 марта 2011

Синтаксис 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;
 }
51 голосов
/ 04 марта 2011

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

enumInstance = SomethingElse;

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

31 голосов
/ 12 сентября 2011

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

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

2 голосов
/ 06 ноября 2015

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

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

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

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
}
...