2010-04-08 17 views
27

Na http://blogs.msdn.com/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx znajduje się tabela przedstawiająca funkcje C++ 0x, które są implementowane w 2010 RC. Wśród nich są wyszczególnione nagłówki przesyłania i wyliczenia wyrażeń mocno napisanych, ale są one wymienione jako "częściowe". Główny tekst artykułu mówi, że oznacza to, że są one niekompletne lub wdrożone w jakiś niestandardowy sposób.forward/strong enum w VS2010

Więc mam VS2010RC i bawię się z funkcjami C++ 0x. Nie mogę wymyślić tych i nie mogę znaleźć żadnej dokumentacji na temat tych dwóch funkcji. Nawet najprostsze próby nie kompilują.


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 ========== 

Wygląda więc na to, że musi być jakiś zupełnie niestandardowa realizacja które pozwoliło im uzasadnić nazywając tę ​​funkcję „częściowo” done. W jaki sposób mogę przepisać ten kod, aby uzyskać dostęp do funkcji przekazywania i typu silnego?

Niektóre dalsze informacje na temat nowych funkcji I 'm próby użycia:

silnie wpisane teksty stałe: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf

Forward deklaracja teksty stałe: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf

+0

pamiętać, że są oddzielne programy testowe. E w drugim nie jest próbą przekazania deklaracji tego samego E co w pierwszym. –

Odpowiedz

29

Myślę, że znalazłem odpowiedź. Znalazłem "klasę enum" w dokumentacji VS 2010 pod dokumentacją słów kluczowych. Jest zarządzany tylko - nieobsługiwany w rzeczywistych kompilacjach C++. Wydaje się więc, że oznaczają one, że ta funkcja C++ 0x jest "częściowo wykonana", ponieważ nie jest w ogóle wykonana.

+0

, nawet jeśli nie jest to błąd, możesz spróbować poprosić o to na http://connect.microsoft.com/ –

+2

Uwaga: Działa w Visual Studio 2012 RC. – MasterMastic

6

Zastanawiam się również nad tym, ale domyślam się, że po prostu korzystają z istniejącego niestandardowego rozszerzenia w swoim kompilatorze.

VC10 (i starszych) akceptuje kodu:

enum E : short { test }; 

E val = E::test; 

Oznacza to, że masz prawo do używania nazwy enum jako kwalifikator przestrzeni nazw, a masz prawo do określenia rodzaju.

chodzi o teksty stałe wybiegających oświadczył, co następuje kompiluje dobrze dla mnie:

enum E; 

bez specyfikatora typu

+0

hmm ... tak, udało mi się przesłać dalej deklarować wyliczenie bez specyfikatora typu. Nie można później zastosować specyfikatora typu, a deklaracja przekazania odrzuci ten specyfikator, jeśli spróbujesz. –

+0

Podobno określający typ podstawowy został wprowadzony [w MSVC 8] (http://msdn.microsoft.com/en-us/library/2dzy4k6e%28v=vs.80%29.aspx). –