2009-01-14 4 views
6

Auf this question, gibt es an answer, die besagt:Scope-Auflösung-Operator auf enums eine Compiler-spezifische Erweiterung?

Sie typedef verwenden können, um Farbe Aufzählungstyp „vollständigen Namen“ es ist ohne Angabe zugänglich zu machen.

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

, die mir richtig klingt, aber jemand nach unten gestimmt es war für diesen Kommentar:

den Bereichsauflösungsoperator Mit :: auf Aufzählungen (wie in „Color :: BLUE“) ist eine Compiler-spezifische Erweiterung, nicht Standard C++

Ist das wahr? Ich glaube, ich habe das sowohl auf MSVC als auch auf GCC verwendet, obwohl ich mir nicht sicher bin.

Antwort

7

habe ich versucht, den folgenden Code:

enum test 
{ 
    t1, t2, t3 
}; 

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

Visual C++ 9 mit der folgenden Warnung zusammengestellt:

Warnung C4482: Nicht-Standard-Erweiterung verwendet: enum 'test' in qualifizierten Namen verwendet

Sieht nicht wie es Standard ist.

+0

Hm, du hast Recht. Jetzt, wo ich darüber nachdenke, habe ich "Sample :: BLUE" verwendet, nicht "Color :: BLUE". Vielen Dank. –

+3

Hinweis: Dies ist kein Standard für C++ 98. Es ist Standard in C++ 11. –

3

In Standard-C++ müssen Dinge links von "::" eine Klasse oder ein Namespace sein, Enums zählen nicht.

+3

... oder Struktur oder Union. –

0

Sie können einen Namespace erstellen, der denselben Namen wie die Enumeration hat. Dadurch werden die Enumerationswerte effektiv in ihren eigenen Bereich eingefügt, und Sie können den Namen der Enumeration/des Namespace verwenden, um auf sie zu verweisen. Natürlich funktioniert es nur für Aufzählungen, die sonst im globalen Bereich (oder einem anderen Namespace) existieren würden.

Es gibt auch irgendwo einen Artikel zu diesem Thema.

8

Das ist nicht Standard.

In C++ 11 können Sie bereichsspezifische Enums mit einer enum class Deklaration erstellen.

Bei C++ - 11-Compilern müssen Sie die Enumeration in einer Struktur oder einem Namespace definieren, um eine Enumeration zu definieren.

+3

Hinweis: In C++ 11 können Sie das Scoping auch für Nicht-'class'' enum's verwenden. Sie müssen * sie * nicht so skalieren, wie Sie es mit 'enum class' machen. –