2010-10-14 11 views
6

मैंने इसे गुगल करने की कोशिश की, लेकिन मैं एक उपयुक्त उत्तर के साथ आने में असमर्थ था। क्या कोई सी ++ गुरु मुझे बता सकता है कि सी ++ के लिए आपको OuterClass <T> घोषित करने की आवश्यकता है :: टाइपनाम कीवर्ड के साथ इनरक्लास?सी ++ टाइपनाम और आंतरिक कक्षाएं

मैं डेटा संरचना पाठ्यक्रम के लिए एक टीए हूं और मैं हर समय यह त्रुटि देखता हूं। मैं अपने छात्रों को यह बताना चाहता हूं कि उन्हें रिटर्न टाइप के सामने टाइपनाम को रखना होगा, लेकिन मैं यह समझाने में असमर्थ हूं कि इसकी आवश्यकता क्यों है।

धन्यवाद।

+0

यदि आप एक छोटे कोड उदाहरण दे सकते हैं? –

उत्तर

6

यह टेम्पलेट्स में दो-चरण नाम लुकअप की वजह से है। जब संकलक इनरक्लास को देखता है तो उसे पता होना चाहिए कि वह नाम एक प्रकार है या नहीं (उदाहरण के लिए, उदाहरण के लिए, OuterClass के कुछ विशेषज्ञता के लिए int int का स्थिर सदस्य होना चाहिए)। तो ऐसा लगता है कि यह तब तक एक प्रकार का नाम नहीं है जब तक आप ऐसा न कहें। टाइपनाम का उपयोग टेम्पलेट्स में और टेम्पलेट पैरामीटर पर निर्भर नामों पर ही किया जाना चाहिए। HTH

उदाहरण:

template <class T> 
class X 
{ 
    typedef T XXX; 
}; 
template<> 
class X<char> 
{ 
    static int XXX; 
}; 

template<class T> 
class Y 
{   
    // X<T>::XXX member; invalid XXX is not assumed to be a type! 
    typename X<T>::XXX member; 
    //we explicitly specify that XXX is a type; Later, upon instantiation, we will verify that 
}; 
4

OuterClass<T>::Innerclass

ऐसा इसलिए है क्योंकि Innerclass एक type का प्रतिनिधित्व करता है (जैसा कि मैंने अपने प्रश्न से देख सकते हैं) ताकि आप से पहले OuterClass<T>::Innerclass

उदाहरण कीवर्ड typename जोड़ने की जरूरत:

template <class T> 
void foo() { 
    T::iterator * iter; 
    ... 
} 

typenameT::iterator * iter; बिना T::iterator औरके बीच गुणात्मक संचालन के रूप में व्याख्या की जाएगी

+2

असल में कारण यह है कि संकलक इस जानकारी को निर्धारित नहीं कर सकता है (टेम्पलेट्स के कारण) जब उसे इसकी आवश्यकता होती है। –

+1

@Let_Me_Be: कंपाइलर जानता है कि कोड को समझना कैसा है। यह प्रोग्रामर की * इरादा * निर्धारित नहीं कर सकता है। और उसके बाद वीसी ++ है जो आश्रित नामों की जांच नहीं करता है और जब टेम्पलेट का इरादा होता है तो चीजें काम करता है। वीसी ++ उचित परिस्थितियों के तहत एक ही कार्य से एक गुणा और सूचक सूचक दोनों का उत्पादन करने में सक्षम होना चाहिए :) – UncleBens

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