2010-04-08 18 views
27

में आगे/मजबूत enum http://blogs.msdn.com/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx पर एक तालिका है जो सी ++ 0x विशेषताएं दिखाती है जो 2010 आरसी में लागू की जाती हैं। उनमें से अग्रेषित enums सूचीबद्ध हैं और दृढ़ता से टाइप enums लेकिन वे "आंशिक" के रूप में सूचीबद्ध हैं। लेख का मुख्य पाठ कहता है कि इसका मतलब है कि वे कुछ गैर-मानक तरीके से अधूरे या कार्यान्वित हैं।वीएस -2010

तो मुझे वीएस -2010 आरसी मिल गया है और मैं सी ++ 0 एक्स सुविधाओं के साथ खेल रहा हूं। मैं इन लोगों को समझ नहीं सकता और इन दो विशेषताओं पर कोई दस्तावेज नहीं ढूंढ सकता। यहां तक ​​कि सबसे सरल प्रयास संकलित नहीं करते हैं।


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

तो ऐसा लगता है यह कुछ पूरी तरह से गैर मानक कार्यान्वयन है कि उन्हें इस सुविधा "आंशिक रूप से" हो गया बुला सही ठहराने के लिए अनुमति दी गई है होना चाहिए। अग्रेषण और मजबूत प्रकार की सुविधा तक पहुंचने के लिए मैं उस कोड को फिर से लिखूंगा?

नई सुविधाओं मैं उपयोग करने का प्रयास कर रहा हूँ के बारे में कुछ अधिक जानकारी के:

जोरदार टाइप किया enums: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf

enums के आगे घोषणा: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf

+0

नोट है कि इन अलग परीक्षण कार्यक्रम हैं:

आगे घोषित enums का सवाल है, निम्नलिखित मेरे लिए ठीक संकलित करता है। ई दूसरे में ई को पहले ई के रूप में घोषित करने का प्रयास नहीं है। –

उत्तर

29

मुझे लगता है कि मैं इस सवाल का जवाब मिल गया। मुझे कीवर्ड प्रलेखन के तहत वीएस 2010 दस्तावेज में "एनम क्लास" मिला। यह केवल प्रबंधित है - असली सी ++ बिल्ड में असमर्थित। तो ऐसा लगता है कि उनका मतलब है कि यह सी ++ 0 एक्स सुविधा "आंशिक रूप से किया गया" है कि यह बिल्कुल नहीं किया जाता है।

+0

भले ही यह कोई बग न हो, हो सकता है कि आप इसे http://connect.microsoft.com/ –

+2

पर पूछने का प्रयास कर सकें नोट: यह विजुअल स्टूडियो 2012 आरसी में काम करता है। – MasterMastic

6

मुझे इस बारे में भी आश्चर्य हुआ, लेकिन मेरा अनुमान है कि वे बस अपने कंपाइलर में मौजूदा गैर-मानक विस्तार का उपयोग कर रहे हैं।

VC10 (और पुराने) इस तरह कोड स्वीकार करता है:

enum E : short { test }; 

E val = E::test; 

है, तो आप एक namespace क्वालीफायर के रूप में enum नाम उपयोग करने की अनुमति है कि, और आप प्रकार निर्दिष्ट करने की अनुमति है। प्रकार निर्दिष्टकर्ता बिना

enum E; 

+0

हम्म ... हाँ, मैं प्रकार विनिर्देशक के बिना enum घोषित करने में सक्षम था। बाद में एक प्रकार के विनिर्देशक को लागू नहीं कर सकता है और आगे की घोषणा अगर आप कोशिश करते हैं तो निर्दिष्टकर्ता को अस्वीकार कर देता है। –

+0

निस्संदेह अंतर्निहित प्रकार को निर्दिष्ट किया गया था [एमएसवीसी 8] में (http://msdn.microsoft.com/en-us/library/2dzy4k6e%28v=vs.80%29.aspx)। –