2010-07-19 15 views
8

संभावित डुप्लिकेट एक टेम्पलेट निर्दिष्ट इनपुट प्रकार के साथ एक और टेम्पलेट वर्ग इनहेरिट:
GCC problem : using a member of a base class that depends on a template argument
Why does GCC need extra declarations in templates when VS does not?
Why doesn’t a derived template class have access to a base template class
iphone compiler inherited templated base classes with passed through type not being expanded in time (just look)सी ++ खाका वर्ग

भ्रामक शीर्षक के लिए क्षमा करें, सबसे अच्छा मैं साथ आ सकता था।

यहाँ मेरी समस्या को वर्णन करने के लिए कुछ कोड है ...

एक आधार टेम्पलेट वर्ग:

template<class T> class TestBase 
{ 
public: 
    int someInt; 
}; 


अन्य टेम्पलेट वर्ग के साथ TestBase उपवर्ग करने का प्रयास कर ...

यह संकलन समय पर "कुछ इस दायरे में घोषित नहीं किया गया" प्राप्त होता है:

template<class X> class TestSub : public TestBase<X> 
{ 
    void testf() 
    { 
     someInt = 0; //Error: "someInt was not declared in this scope" 
    } 
}; 



बी) यह (अंतर किया जा रहा है कि मैं TestBase के टेम्पलेट इनपुट स्पष्ट रूप से)

template<class X> class TestSub : public TestBase<string> 
{ 
    void testf() 
    { 
     someInt = 0; 
    } 
}; 



TestSub (ए से क्यों निर्दिष्ट ठीक काम करता है) के वारिस नहीं कुछ ठीक से नहीं है क्योंकि यह (बी) में करता है?

अग्रिम धन्यवाद।

+1

http://stackoverflow.com/questions/11405/gcc-problem-using-a-member-of-a-base-class-that-depends-on-a-template-argument की डुप्ली के रूप में बंद किया गया है और http://stackoverflow.com/questions/1643035/typedef-in-template-base-class और http://stackoverflow.com/questions/1239908/why-doesnt-a-derived-template-class-have-access- टू-ए-बेस-टेम्पलेट-क्लास और http://stackoverflow.com/questions/2812470/why-does-gcc-need-extra-declarations-in-templates-when-vs-does-not और कई अन्य –

उत्तर

7

क्योंकि टेस्टबेस को X पर विशेष रूप से एक्स पर विशेष किया जा सकता है। इसलिए आपको संकलन को कुछ जानने की ज़रूरत है, यह पूरी तरह योग्यता से निर्भर नहीं है।

के बजाय
 someInt = 0 

कहना बल्कि

 TestBase<X>::someInt = 0 

तुम भी

 this->someInt = 0 

बिंदु इस्तेमाल कर सकते हैं संकलक एक नाम मान नहीं होंगे टेम्पलेट पैरामीटर पर निर्भर है यह यह है पता होना चाहिए है इससे पहले कि यह तत्काल समय की जांच करता है। एक प्रयोग के लिए देखें कि जब आप वैश्विक कुछ परिचय देते हैं तो क्या होता है।

+1

या पूर्ण योग्यता के बजाय बस 'this-> someInt' का उपयोग करें। –

+0

हाँ, बस इसे जोड़ा गया। –

+1

कृपया ध्यान दें कि तत्कालता तक लुकअप को परिभाषित करना पर्याप्त नहीं है। मानक स्पष्ट रूप से कहता है कि तत्काल समय पर, अयोग्यता वाले लुकअप के दौरान निर्भर आधार वर्गों में अयोग्य नामों को नहीं देखा जाता है। यह 'this-> someInt' और अन्य के लिए काम करने के लिए होता है क्योंकि वे अयोग्य लुकअप नहीं करते हैं। इसके बारे में तर्क करते समय यह विवरण अक्सर अनदेखा किया जाता है, लेकिन यह महत्वपूर्ण है। –

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