2009-01-14 2 views
6

Sur this question, il y a an answer que les États:Opérateur de résolution d'étendue sur enums une extension spécifique au compilateur?

Vous pouvez utiliser typedef pour faire type d'énumération couleur accessible sans spécifier son « nom complet ».

typedef Sample::Colour Colour; 
Colour c = Colour::BLUE; 

Cela semble correct pour moi, mais quelqu'un vers le bas a voté et a laissé ce commentaire:

Utilisation de l'opérateur de résolution de portée :: sur énumérations (comme dans « Couleur :: BLUE ») est une extension spécifique au compilateur, non standard. C++

Est-ce vrai? Je crois que je l'ai utilisé à la fois sur MSVC et GCC, même si je n'en suis pas certain.

Répondre

7

J'ai essayé le code suivant:

enum test 
{ 
    t1, t2, t3 
}; 

void main() 
{ 
    test t = test::t1; 
} 

Visual C++ 9 compilé avec l'avertissement suivant:

avertissement C4482: l'extension non standard utilisé: ENUM test utilisé en qualifié nom

Cela ne ressemble pas à la norme.

+0

Hm, vous avez raison. Maintenant que j'y pense, ce que j'ai utilisé était l'équivalent de 'Sample :: BLUE', pas de' Color :: BLUE'. Merci. –

+3

Remarque: ce n'est pas la norme pour C++ 98. C'est la norme en C++ 11. –

3

En C++ standard, les éléments à gauche de "::" doivent être une classe ou un espace de noms, les énumérations ne sont pas prises en compte.

+3

... ou struct ou union. –

0

Ce que vous pouvez faire pour contourner ce problème consiste à créer un espace de noms portant le même nom que l'énumération. Cela va effectivement ajouter les valeurs d'énumération dans leur propre portée et vous pouvez utiliser le nom de l'énumération/namespace pour s'y référer. Bien sûr, cela ne fonctionne que pour les énumérations qui existeraient autrement dans la portée globale (ou dans un autre espace de noms).

Il y a aussi un article sur ce sujet quelque part.

8

Ce n'est pas standard.

En C++ 11, vous serez en mesure de créer des énumérations avec une déclaration enum class. Avec les compilateurs pre-C++ 11, pour définir une énumération, vous devez définir l'énumération à l'intérieur d'une structure ou d'un espace de noms.

+3

Remarque: En C++ 11, vous pouvez également utiliser la portée pour les enum non-'class' '. Vous n'avez simplement * pas * à les définir comme vous le faites avec 'enum class'. –

Questions connexes