2013-01-15 14 views
8

के आंतरिक प्रकार के बाद का उपयोग कर रहा Visual C++ 2010 उपयोग कर रहा हूँ, और यहाँ मेरे कोड का टुकड़ा है , कोई मुझे मदद कर सकता है?सी ++ 11 संकलक त्रुटि decltype (वर) "वर"

> error C2039: 'value_type' : is not a member of '`global namespace'' 
> error C2146: syntax error : missing ';' before identifier 'param' 
+8

यह एक संकलक बग –

उत्तर

7

के रूप में यह एक दृश्य स्टूडियो बग कनेक्ट पर पिछले साल उठाया गया था है हो सकता है। यह issue 757545 ("Cannot use decltype before scope operator") है।

इस मुद्दे के साथ एक वर्कअराउंड सूचीबद्ध है जो प्रभावी रूप से @ iammillind के समान है, सिवाय इसके कि यह std::identity का उपयोग करता है जिसे <functional> से सी ++ 11 के प्रकाशन से कुछ समय पहले हटा दिया गया था। (std::common_type एक टेम्पलेट पैरामीटर के साथ बराबर है; std::remove_reference कुछ मामलों में एक ही है।)

+0

@Potatoswatter है: विशेष रूप से वैकल्पिक हल कनेक्ट पर तैनात किया जा रहा है, हाँ करना चाहिए वी.एस. इसका समर्थन करता है निकलता है। मैं केवल कामकाज जमाकर्ता की इच्छा रखता हूं; [आश्चर्य, आश्चर्य, एमएसडीएन परवाह नहीं है।] (http://msdn.microsoft.com/en-gb/library/ee391705.aspx) –

+4

'std :: common_type ' वास्तव में सही प्रतिस्थापन है। – Xeo

4

मुझे लगता है कि जी ++ 4.7.2 संस्करण के साथ, कोड ठीक संकलित करता है। तो यह एमएसवीएस में कंपाइलर बग हो सकता है।
कुछ समय के लिए आप चाल नीचे की कोशिश कर सकते हैं:

DECLTYPE(s)::value_type param = 0; 

अस्वीकरण:

#ifdef COMPILER_BUG_STILL_THERE 
template<typename T> struct Get { typedef T type; }; 
#define DECLTYPE(VAR) Get<decltype(VAR)>::type 
#else 
#define DECLTYPE(VAR) decltype(VAR) 
#endif 

के रूप में यह प्रयोग करें चाल के साथ बेशक, आप typename जब अंदर टेम्पलेट का उपयोग करना पड़ सकता है। उसके लिए आपको 1 और मैक्रो ऐसे #define TDECLTYPE(VAR) typename DECLTYPE(VAR)

संबंधित मुद्दे