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