2010-04-08 10 views
27

Bei http://blogs.msdn.com/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx gibt es eine Tabelle mit C++ 0x Features, die in 2010 RC implementiert sind. Unter ihnen sind aufgelistete Weiterleitungs-Enums und stark typisierte Enums aufgeführt, aber sie sind als "teilweise" aufgelistet. Der Haupttext des Artikels besagt, dass dies bedeutet, dass sie entweder unvollständig sind oder auf nicht-standardisierte Weise implementiert werden.forward/strong enum in VS2010

Also ich habe VS2010RC und bin mit den C++ 0x Funktionen herumspielen. Ich kann diese nicht herausfinden und kann keine Dokumentation zu diesen beiden Merkmalen finden. Nicht einmal die einfachsten Versuche kompilieren.


enum class E { test }; 
int main() {} 
 
fails with: 

1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C2332: 'enum' : missing tag name 
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C2236: unexpected 'class' 'E'. Did you forget a ';'? 
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C3381: 'E' : assembly access specifiers are only available in code compiled with a /clr option 
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C2143: syntax error : missing ';' before '}' 
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(518): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

 


int main() 
{ 
    enum E : short; 
} 
 

Fails with: 
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(513): warning C4480: nonstandard extension used: specifying underlying type for enum 'main::E' 
1>e:\dev_workspace\experimental\2010_feature_assessment\2010_feature_assessment\main.cpp(513): error C2059: syntax error : ';' 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

So scheint es, muss es einige völlig Nicht-Standard-Implementierung sein, die sie um diese Funktion zu rechtfertigen erlaubt hat, ruft „teilweise“ done. Wie würde ich diesen Code umschreiben, um auf die Weiterleitungsfunktion und den starken Typ zugreifen zu können?

Einige weiteren Informationen über die neuen Funktionen, die ich zu verwenden ist versucht:

Stark Aufzählungen getippt: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf

Forward-Deklaration von Aufzählungen: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf

+0

Beachten Sie, dass diese separaten Testprogramme sind. E in der zweiten ist kein Versuch, das gleiche E wie in der ersten vorwärts zu deklarieren. –

Antwort

29

glaube ich die Antwort gefunden. Ich habe "enum class" in der VS 2010 Dokumentation unter der keywords Dokumentation gefunden. Es wird nur verwaltet - in echten C++ - Builds nicht unterstützt. Es scheint also, dass sie meinen, dass diese C++ 0x-Funktion "teilweise erledigt" ist, weil sie überhaupt nicht ausgeführt wird.

+0

auch wenn es kein Fehler ist, vielleicht können Sie versuchen, es auf http://connect.microsoft.com/ –

+2

Hinweis: Es funktioniert in Visual Studio 2012 RC. – MasterMastic

6

Ich habe mich auch über dieses Thema gewundert, aber ich schätze, dass sie einfach eine existierende Nicht-Standard-Erweiterung in ihrem Compiler verwenden.

VC10 (und älter) akzeptiert Code wie folgt:

enum E : short { test }; 

E val = E::test; 

Das heißt, sind Sie erlaubt den Enum Name als Namespace-Qualifikationsspiel zu verwenden, und Sie dürfen den Typ angeben.

Wie für die Zukunft erklärte Aufzählungen erstellt die folgenden gut für mich:

enum E; 

ohne Typspezifizierer

+0

hmm ... ja, ich konnte das enum ohne Typangabe weiterleiten. Ein Typspezifizierer kann später nicht angewendet werden, und die Weiterleitungsdeklaration weist diesen Spezifizierer zurück, wenn Sie dies versuchen. –

+0

Anscheinend wurde der zugrunde liegende Typ angegeben [in MSVC 8] (http://msdn.microsoft.com/en-us/library/2dzy4k6e%28v=vs.80%29.aspx). –