2013-07-06 12 views
15

यह मेरी समझ है कि किसी वस्तु/चर के प्रकार से पूछताछ करने के लिए decltype का उपयोग किया जाता है और इसी तरह।गिरावट की उपस्थिति में स्कोप रिज़ॉल्यूशन विफल क्यों होता है?

जैसे कि निम्न विकिपीडिया पर उपस्थित उदाहरण, से:

int i; 
decltype(i) x3; // type is int 

मुझे लगता है मैं कुछ इस तरह कर सकता है ग्रहण किया:

class A 
{ 
public: 
    int a, b; 
}; 

template<typename T> 
struct IsClass 
{ 
    enum { Yes = std::is_class<T>::value }; 
    enum { No = !Yes }; 
}; 

std::vector<A> v; 
auto it = v.begin(); 
IsClass<decltype(it)::value_type>::Yes 

क्योंकि के बाद यह सब लाइन कानूनी है:

IsClass<std::vector<A>::iterator::value_type>::Yes 

हां यह संकलित नहीं करेगा, निम्नलिखित का हवाला देते हुए: error C2039: 'value_type' : is not a member of ' वैश्विक नामस्थान '' `

किसी भी विचार के कारण कि गिरावट की उपस्थिति में इस तरह से व्यवहार करने के लिए स्कोप रिज़ॉल्यूशन क्यों किया गया था?

पी.एस: यदि यह

+5

'gcc' और' clang' इस स्वीकार करने के लिए लग रहे हैं: http://coliru.stacked-crooked.com/view?id=bc884ca6b1f51d36c231f2eb08dec3ad-f674c1a6d04c632b71a62362c0ccfc51 –

+0

@ShafikYaghmour मैं सिर्फ इस MSVC2012 में जो मैं (मैं उपयोग कर रहा हूँ चिपकाया इस प्रभाव में एक नोट जोड़ा) और यह संकलित नहीं करता है। – Borgleader

+3

एमएसवीसी हालांकि चूसता है, उन्होंने जीसीसी और क्लैंग – aaronman

उत्तर

10

( नवम्बर सीटीपी के बिना ) कोई फर्क मैं MSVC2012 उपयोग कर रहा हूँ बनाता है यह विजुअल C++ संकलक में एक ज्ञात बग है। इसे अभी तक दृश्य सी ++ 2013 पूर्वावलोकन के रूप में तय नहीं किया गया है। (कि तर्क प्रकार एक टेम्पलेट तर्क पैदावार के साथ std::common_type, यह है कि लंबी metaprogramming में इस्तेमाल किया गया identity टेम्पलेट के मानकीकृत सी ++ 11 बराबर है।)

IsClass<std::common_type<decltype(it)>::type::value_type>::Yes 
     ^^^^^^^^^^^^^^^^^   ^^^^^^^ 

: आप std::common_type का उपयोग कर इस समस्या के समाधान कर सकते हैं

आप माइक्रोसॉफ्ट कनेक्ट पर सार्वजनिक बग रिपोर्ट पा सकते हैं: Cannot use decltype before scope operator। यदि यह समस्या आपके लिए महत्वपूर्ण है, तो कृपया उस बग रिपोर्ट को ऊपर उठाने पर विचार करें।

+1

अभी भी समझ में नहीं आता कि वे इसे 'std :: पहचान' क्यों नहीं कह सकते हैं। हाँ, हर किसी की तरह। –

+0

@LightnessRacesinOrbit: पहले 'std :: पहचान' था, लेकिन इसे हटा दिया गया है क्योंकि यह स्पष्ट नहीं था कि यह वास्तव में क्या होना चाहिए (बस मेटा-प्रोग्रामिंग पहचान, जैसे 'std :: common_type ' अब है? कार्यात्मक पहचान?) , आईआईआरसी। – Xeo

+0

@ कक्षा में लाइटनेस रेस: यह इस बात की तरह दिखता नहीं है कि इसे "कॉल" करना है। 'Std :: common_type' की कार्यक्षमता' std :: पहचान' की तुलना में व्यापक है। इसमें बस 'std :: पहचान' भी शामिल है। तो सवाल वास्तव में था कि 'std :: पहचान' को किसी सुंदर नाम के साथ रखना या इसे अनावश्यक रूप से निकालना है या नहीं। उन्होंने इसे हटा दिया। – AnT

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