2010-04-08 7 views
27

http://blogs.msdn.com/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx adresinde, 2010 RC'de uygulanan C++ 0x özelliklerini gösteren bir tablo bulunmaktadır. Bunların arasında forwarding enum ve güçlü yazılan enumlar listelenir, ancak "parsiyel" olarak listelenir. Makalenin ana metni, bunların ya eksik ya da standart olmayan bir şekilde uygulandığı anlamına geldiğini söylüyor.ileri/güçlü enum

Yani VS2010RC var ve C++ 0x özellikleri ile oynamaktayım. Bunları anlayamıyorum ve bu iki özellik hakkında herhangi bir belge bulamıyorum. En basit girişimler bile derlenmez.


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

Yani onları "kısmen" bitti bu özelliği çağıran haklı sağladı bazı tamamen standart dışı bir uygulama olmalıdır görünüyor. Yönlendirme ve güçlü tip özelliğine erişmek için bu kodu nasıl yeniden yazarım?

kullandığım çalışılıyor yeni özellikler hakkında bazı ayrıntılı bilgiler:

Kesinlikle yazdığınız çeteleler: çeteleler http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf

İleri ifadesi: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf

+0

Not. İkincisindeki E, ilkinde olduğu gibi aynı E'yi beyan etme girişimi değildir. –

cevap

29

ben cevabı buldum. Anahtar kelimeler dokümantasyonunda VS 2010 belgelerinde "enum sınıfı" buldum. Sadece yönetilir - gerçek C++'da desteklenmez. Bu yüzden bu C++ 0x özelliğinin "kısmen tamamlandı" olduğu anlamına gelmediği anlaşılıyor.

+0

hata olmasa bile, http://connect.microsoft.com/ –

+2

adresinden sormaya çalışabilirsiniz. Not: Visual Studio 2012 RC'de çalışır. – MasterMastic

6

Bunu da merak ettim, ama benim tahminim sadece derleyicisindeki mevcut standart olmayan bir uzantıyı kullanmak.

VC10 (ve üstü) böyle bir kod kabul eder:, bir ad eleme olarak enum adını kullanmak için izin konum ve siz türünü belirtmek izin konum

enum E : short { test }; 

E val = E::test; 

. ileriye beyan çeteleler gelince

, şu benim için iyi derler:

enum E; 

tipi belirleyici olmayan bu ayrı test programları olduğunu

+0

hmm ... evet, enum'u tür belirteci olmadan iletmeyi başardım. Daha sonra bir tür belirtici uygulayamazsınız ve ileriye doğru beyan denerseniz, belirticiyi reddeder. –

+0

Görünen altta yatan türün belirtilmesi [MSVC 8'de] (http://msdn.microsoft.com/en-us/library/2dzy4k6e%28v=vs.80%29.aspx). –