2009-11-07 11 views
8

मैं एक साधारण कंटेनर की है। अब, जब मैं फ़ंक्शन के रिटर्न-प्रकार का जिक्र कर रहा हूं, तो मुझे लगता है कि यह list<nodeType>::node* होना चाहिए। क्या यह सही है? जब मैं समारोह इनलाइन परिभाषित करते हैं, यह पूरी तरह काम करता है:टेम्पलेट्स और नेस्टेड वर्गों/संरचनाओं

template <class nodeType> list { 
    public: 
     struct node { 
      nodeType info; 
      node* next; 
     }; 

     node* _search { 
      node* temp; 
      // search for the node 
      return temp; 
     } 
}; 

लेकिन, अगर मैं कक्षा के बाहर समारोह को परिभाषित,

template <class nodeType> list<nodeType>::node* list<nodeType>::_search() { 
    //function 
} 

यह काम नहीं करता। कंपाइलर Expected constructor before list<nodeType>::_search या कुछ कहकर एक त्रुटि देता है। त्रुटि इस तरह कुछ है। मेरे पास एक मशीन नहीं है जिस पर मैं वर्तमान में इसका परीक्षण कर सकता हूं।

किसी भी मदद की ईमानदारी से सराहना की जाती है।

उत्तर

21

ऐसा इसलिए है क्योंकि node एक निर्भर प्रकार है। आप के रूप में (ध्यान दें कि मैं स्पष्टता के लिए 2 लाइनों में यह हड्डी टूट गई है)

template <class nodeType> 
typename list<nodeType>::node* list<nodeType>::_search() 
{ 
    //function 
} 

नोट typename कीवर्ड के उपयोग इस प्रकार हस्ताक्षर लिखने के लिए की जरूरत है।

+1

अधिक, बहुत geeky, विवरण सी ++ एफएक्यू लाइट में पाया जा सकता है: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18 –

+0

मदद के लिए बहुत बहुत धन्यवाद .. यह अब पूरी तरह से काम करता है। धन्यवाद फिर से .. –

+0

एफएक्यू के लिए अद्यतन लिंक: https://isocpp.org/wiki/faq/templates#dependent-name-lookup-types – Ashe

6

आप संकलक कि node एक प्रकार कीवर्ड typename उपयोग कर रहा है यह बताने के लिए .Otherwise यह class list में एक static चर के रूप में नोड सोचेंगे की जरूरत है। जब भी आप सूची के कार्यान्वयन में किसी प्रकार के रूप में नोड का उपयोग करते हैं तो typename जोड़ें।

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