2015-09-18 9 views
5

मान लीजिए कि मेरे पास एक टेम्पलेट क्लास है जिसे मैं मित्र वर्ग के रूप में घोषित करने की कोशिश कर रहा हूं। क्या मुझे कक्षा घोषित करना चाहिए या इसे अपना टेम्पलेट देना चाहिए? दोनों यहां काम करते प्रतीत होते हैं, लेकिन मुझे इस बारे में दिलचस्पी है कि इसे सही तरीके से कैसे किया जाए।टेम्पलेट मित्र वर्ग: आगे की घोषणा या ...?

उदाहरण:

template <typename E> 
class SLinkedList; 
template <typename E> 
class SNode { 
private: 
    E elem; 
    SNode<E>* next; 
    friend class SLinkedList<E>; 
}; 

या

template <typename E> 
class SNode { 
private: 
    E elem; 
    SNode<E>* next; 
    template <typename T> 
    friend class SLinkedList; 
}; 

-

क्या इसके लायक के लिए, इस कोड क्या सीधे एक डाटा संरचनाओं और एल्गोरिदम पाठ्यपुस्तक से बाहर है से संशोधित किया गया है। हालांकि, पुस्तक निम्नलिखित कोड जो Xcode में त्रुटि "गैर टेम्पलेट वर्ग के 'SLinkedList'

template <typename E> 
class SNode { 
private: 
    E elem; 
    SNode<E>* next; 
    friend class SLinkedList<E>; 
}; 

इसलिए इस सवाल का। सी पर नए ++ स्पष्ट विशेषज्ञता देता है उपयोग करता है।

उत्तर

9

आपका पहला दृष्टिकोण शायद क्या है आप चाहते हैं। यह सब मिलान प्रकार के लिए SLinkedList<int>SNode<int> एक दोस्त है, और इसी तरह के कर देगा।

आपका दूसरा दृष्टिकोण हर SLinkedList हर SNode के एक दोस्त कर देगा। यह शायद नहीं है के रूप में SLinkedList<Widget> कोई व्यवसाय को छू है आप क्या चाहते हैं निजी एक SNode<int>


की ई भागों एक अलग दृष्टिकोण मेरा सुझाव सकता SNode एक नेस्टेड वर्ग बनाने के लिए किया जाएगा। , आप के रूप में अच्छी के दोस्त घोषणा छुटकारा पाने और SNode में सब कुछ सार्वजनिक होना पड़ सकता है इस योजना के साथ

template <typename E> 
class SLinkedList { 
    struct SNode { 
     E elem; 
     SNode* next; 
    }; 
}; 

क्योंकि पूरी कक्षा SLinkedList

करने के लिए निजी होगा: यह नोड्स से मिलकर डेटा संरचनाओं के लिए बहुत आम है
+0

दिलचस्प सुझाव। चियर्स – badfilms

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