2010-04-08 6 views
27

En http://blogs.msdn.com/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx hay una tabla que muestra las características C++ 0x que se implementan en 2010 RC. Entre ellos se enumeran las entras de reenvío y las enumeraciones fuertemente tipadas, pero se enumeran como "parciales". El texto principal del artículo dice que esto significa que están incompletos o implementados de alguna manera no estándar.enum delantero/fuerte en VS2010

Así que tengo VS2010RC y estoy jugando con las características de C++ 0x. No puedo entender estos y no puedo encontrar ninguna documentación sobre estas dos características. Ni siquiera los intentos más simples compilan.


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

por lo que parece que debe ser alguna aplicación totalmente no-estándar que les ha permitido justifican llamar a esta función "parcialmente" terminado. ¿Cómo reescribiría ese código para acceder a la función de reenvío y de tipo fuerte?

Algunos más información sobre las nuevas características que estoy tratando de usar:

fuertemente tipado enumeraciones: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf

declaración adelantada de enumeraciones: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf

+0

Tenga en cuenta que se trata de programas de ensayo separados. E en el segundo no es un intento de reenviar declarar el mismo E como en el primero. –

Respuesta

29

Creo que he encontrado la respuesta. Encontré "clase enum" en la documentación de VS 2010 bajo la documentación de palabras clave. Solo se administra: no se admite en las compilaciones C++ reales. Entonces parece que quieren decir que esta característica de C++ 0x está "parcialmente hecha" porque no se hace en absoluto.

+0

, incluso si no es un error, quizás puedas intentar solicitarlo en http://connect.microsoft.com/ –

+2

Nota: funciona en Visual Studio 2012 RC. – MasterMastic

6

Me pregunté acerca de esto también, pero creo que simplemente están haciendo uso de una extensión existente no estándar en su compilador.

VC10 (y mayores) acepta código como este:

enum E : short { test }; 

E val = E::test; 

Es decir, se le permite utilizar el nombre de enumeración como un calificador de espacio de nombres, y se le permite especificar el tipo.

En cuanto a las enumeraciones forward-declarada, el siguiente se compila bien para mí:

enum E; 

sin el especificador de tipo

+0

hmm ... sí, pude reenviar declarar la enumeración sin el especificador de tipo. No se puede aplicar un especificador de tipo más tarde y la declaración de reenviar rechaza ese especificador si lo intentas. –

+0

Aparentemente al especificar el tipo subyacente se introdujo [en MSVC 8] (http://msdn.microsoft.com/en-us/library/2dzy4k6e%28v=vs.80%29.aspx). –