web-dev-qa-db-fra.com

Mon énumération n'est pas une classe ou un espace de noms

Salut, j'ai des fichiers appelés MyCode.h et MyCode.cpp

Dans MyCode.h, j'ai déclaré

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

class MyClass {

MyEnum enumInstance;
void Foo();

}; 

Puis dans MyCode.cpp:

#include "MyCode.h"

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

mais lors de la compilation avec g ++ j'obtiens l'erreur 'MyEnum' n'est pas une classe ou un espace de noms ...

(fonctionne très bien dans MS VS2010 mais pas sous Linux g ++)

Des idées? Merci Thomas

59
Prof

La syntaxe MyEnum::SomethingElse est une extension Microsoft. Il se trouve que c'est celui que j'aime, mais ce n'est pas du C++ standard. enum des valeurs sont ajoutées à l'espace de noms environnant:

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

 class MyClass {

 MyEnum enumInstance;
 void Foo();

 }

 // implementation
 #include "MyClass.h"

 void Foo() {
     enumInstance = SomethingElse;
 }
63
Max Lybbert

Les énumérations étendues n'existeront pas avant C++ 0x. Pour le moment, votre code doit être

enumInstance = SomethingElse;

Vous pouvez créer une énumération de portée artificielle en plaçant la définition de l'énumération dans son propre espace de noms ou structure.

51
ildjarn

En effet, C++ 0x permet cette fonctionnalité. Je pourrais l'activer avec succès dans gcc en utilisant cet indicateur de ligne de commande: - std = c ++ 0x

C'était avec la version 4.4.5 de gcc

31
gregn3

Comme expliqué dans d'autres réponses: syntaxe MyEnum::SomethingElse n'est pas valide sur les énumérations C++ 98 normales, sauf si votre compilateur les prend en charge via des extensions non standard.

Personnellement, je n'aime pas la déclaration enum MyEnum {A, B}; car le nom de type n'est pas présent lors de l'utilisation des valeurs d'énumération. Cela peut entraîner un conflit de noms dans l'espace de noms actuel.

L'utilisateur doit donc se référer au nom du type à chaque valeur d'énumération. Exemple pour éviter de déclarer A deux fois:

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

Je préfère utiliser un espace ou une structure de nom spécifique. Cela permet de référencer les valeurs d'énumération avec le dernier style C++:

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