2009-10-26 30 views
9

में संरक्षित एक वर्ग के सदस्य मैं यहाँ एक पुराने codebase है, जहां वे सदस्य चर संरक्षित करते थे। चाहे यह एक अच्छा विचार है या नहीं, पर चर्चा की जा सकती है। हालांकि, कोड gcc3 के साथ ठीक संकलित होना चाहिए। मैं एक व्युत्पन्न टेम्पलेट वर्ग बार उस वर्ग टेम्पलेट फू से इतनापहुँच एक व्युत्पन्न वर्ग

template <class Something> class Foo { 
public: 
// stuff... 
protected: 
    some::type x; 
} 

template <class Something> Bar : Foo<Something> { 
public: 
    void cleanup(); 
} 

की तरह और सफाई की विधि घोषणा() वहाँ कुछ एक्स

template <class Something> void Bar<Something>::cleanup() { 
    doSomeThingCleanUpLike (x); 
} 

यह करता है के साथ किया है में संरक्षित का उपयोग करता है सदस्य एक्स है जीसीसी 4 के साथ काम नहीं करते, हालांकि इसे जीसीसी 3 के साथ काम करना चाहिए था। यह काम करता है जब मैं इसे

doSomeThingCleanUpLike (this->x); 

करने के लिए बदल क्यों मामला है?

+1

शब्द "टेम्पलेट क्लास" अक्सर भ्रम का स्रोत होता है। सही शब्द "वर्ग टेम्पलेट" है, क्योंकि यह चीजें कक्षाओं के लिए एक टेम्पलेट है। यह एक वर्ग नहीं है। मैं आपके प्रश्न को संपादित करूंगा लेकिन संभवतः यह कारणों में से एक है कि आप उलझन में हैं। – MSalters

+1

"सफाई" की आपकी फ़ंक्शन परिभाषा अनुरूप नहीं है। "बार" के लिए रिटर्न प्रकार और टेम्पलेट तर्क याद करता है। सुनिश्चित करें कि यह आपके कोड में कैसा है? –

+0

धन्यवाद litb। मैंने इसे बदल दिया। कैफीन का स्तर इसे स्पॉट करने के लिए पर्याप्त नहीं था। भी "कक्षा टेम्पलेट" में बदल गया। चाहे उसका टेम्पलेट क्लास या क्लास टेम्पलेट समस्या को प्रभावित न करे। शब्द केवल अनौपचारिक रूप से उपयोग किया जाता है। – GeeF

उत्तर

13

अभिव्यक्ति x व्युत्पन्न वर्ग में प्रयोग किया जाता मानक, व्युत्पन्न वर्ग के किसी भी टेम्पलेट पैरामीटर पर निर्भर नहीं में नियमों से, है। इस वजह से, टेम्पलेट परिभाषा के संदर्भ में लुकअप होता है, न कि उपयोग/तत्कालता के बिंदु पर। भले ही टेम्पलेट का टेम्पलेट बेस क्लास दिखाई दे रहा है, क्योंकि यह एक टेम्पलेट क्लास है, जिसका उपयोग किया जा सकता है, विशेष तत्कालता में विशेष टेम्पलेट्स शामिल हो सकते हैं, इसलिए बेस क्लास टेम्पलेट परिभाषा का नाम लुकअप के लिए उपयोग नहीं किया जा सकता है।

this->x को अभिव्यक्ति बदल रहा है आप इसे एक आश्रित अभिव्यक्ति कर रहे हैं द्वारा (एक वर्ग टेम्पलेट में this हमेशा टेम्पलेट मापदंडों पर निर्भर करता है)। इसका अर्थ यह है कि लुकअप तत्काल संदर्भ में होगा, जिस आधार पर बेस क्लास पूरी तरह से ज्ञात है और इसके सदस्य दिखाई दे रहे हैं।

+0

+1: * निर्भर */* गैर-निर्भर * नाम। –

6

आप व्युत्पन्न टेम्पलेट परिभाषित कर रहे हैं, संकलक केवल लेकिन आधार टेम्पलेट वर्ग 'नाम जानता नहीं इसकी जानकारी है, तो संकलक पता नहीं है व्युत्पन्न वर्ग एक विरासत सदस्य है। सदस्य के अस्तित्व के कंपाइलर को बताने के लिए, जैसा आपने किया था, this-> का उपयोग करें।

वास्तव में, यह this question का डुप्लिकेट है।

+1

यह ध्यान रखना महत्वपूर्ण है कि 'यह->' जोड़ना एक अनुष्ठान नहीं है, लेकिन एक गैर-निर्भर नाम को एक आश्रित में परिवर्तित करने का एक तरीका है। चार्ल्स द्वारा जवाब देखें। –

+0

अच्छी पकड़, वह प्रश्न _had_ एक खराब शीर्षक है। अब तय उचित अवधि का उपयोग करने पर – MSalters

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