2009-11-26 9 views
8

निम्नलिखित कोड पर विचार करें:मुझे सदस्य को पॉइंटर तक पहुंच नहीं मिल सकती है। क्यूं कर?

template<class T, class F>   struct X {}; 
template<class T, class F, T F::* m> struct Y {}; 

struct Foo { 
    int member; 
    typedef X<int, Foo>    x_type; // works well 
    typedef Y<int, Foo, &Foo::member> y_type; // ERROR 
}; 

typedef Y<int, Foo, &Foo::member> y_type2; // OK 

संकलक त्रुटि उत्पन्न क्यों करता है? (वीएस -2008)


नया

मैंने इस बग को connect.microsoft.com पर पोस्ट किया है।

+1

क्या संकलक आप उपयोग कर रहे है? G ++ 4.3.3 के साथ कोई त्रुटि नहीं है। – sth

+0

संकलक द्वारा लौटाई गई त्रुटि क्या है? – luc

+2

मैं "वाई" टेम्पलेट की घोषणा को समझ नहीं सकता। टेम्पलेट पैरामीटर या तो प्रकार या अभिन्न मूल्य हैं। "टीएफ :: * एम" एक प्रकार नहीं है, जिसके साथ आप अपने टेम्पलेट को पैरामीट्रिज कर सकते हैं ... जब आप "वाई " लिखते हैं, तो अंतिम पैरामीटर एक प्रकार नहीं है और नहीं एक अभिन्न मूल्य। यह सदस्य के लिए एक सूचक है। तो, मैं बेकार हूं, इसे अस्वीकार कर दिया जाना चाहिए ... – SadSido

उत्तर

1

यह एक bug

+1

यही तो मैं ने कहा (http://stackoverflow.com/questions/1802204/i-can-not-get-access-to-pointer-to-member-why/1802365#1802365) –

7

मुझे लगता है कि यह उस दृश्य सी ++ के साथ किसी भी तरह से संबंधित है, उस बिंदु पर सदस्य को सूचक के आकार को नहीं पता। उदाहरण के लिए this दोष रिपोर्ट की जांच करें (here सदस्य चर के सूचक के साथ एक और समस्या है)। मुझे लगता है कि आपको एक और दृश्य सी ++ बग मिला है और इसे connect.microsoft.com पर रिपोर्ट किया जाना चाहिए।

+0

मैं 'बग' सिद्धांत के साथ मेल खाता हूं। मैं हाल ही में एक ही समस्या पर ठोकर खाई, और पाया - लेकिन याद नहीं है - कि उन्होंने अभी तक सूचक-से-सदस्य टेम्पलेट वर्ग तर्कों का 'पूरी तरह से समर्थन' नहीं किया है। – xtofl

+0

हालांकि, कंपाइलर को _size_, imho को जानने की आवश्यकता नहीं है। – xtofl

+0

मेरा मतलब है कि 'आकार' (Foo :: सदस्य) '' Foo' घोषणा के आधार पर 1 या अधिक हो सकता है। –

0

मैं एक ही समस्या पर ठोकर खाई। पॉइंटर-टू-सदस्य टेम्पलेट तर्कों के लिए समर्थन अभी भी वीसी ++ में सीमित है (bug report देखें)।

मेरे मामले में मैं टेम्पलेट फ़ंक्शन i.s.o का उपयोग करके इसके आसपास काम कर सकता था। एक टेम्पलेट वर्ग:

template< typename Class > struct CMemberDumper { 
    Class& object; 
    template< typename M > void visit_member(M C::*pm) { 
     std::cout << object.*pm; 
    } 
}; 
+3

आपकी बग मेरी समस्या से संबंधित नहीं है। यह किसी भी संकलक त्रुटियों के बिना अच्छी तरह से काम करता है। मैं वीएस -2008 का उपयोग करता हूं। –

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

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