2012-01-23 11 views
50

चलो कहते हैं कि मैं एक द्विआधारी पेड़, BT के लिए एक वर्ग बना रहा हूं, और मैं एक वर्ग है जो पेड़, BE का एक तत्व का वर्णन करता है, जैसेटेम्पलेट क्लास मित्र के साथ क्लास टेम्पलेट, वास्तव में यहां क्या चल रहा है?

template<class T> class BE { 
    T *data; 
    BE *l, *r; 
public: 
... 
    template<class U> friend class BT; 
}; 

template<class T> class BT { 
    BE<T> *root; 
public: 
... 
private: 
... 
}; 

यह काम करने के लिए प्रकट होता है कुछ है; हालांकि मेरे पास क्या है इसके बारे में प्रश्न हैं।

मैं मूल रूप से

template<class T> friend class BT; 

लेकिन यह आवश्यक प्रतीत होता है U (या से T अलावा कुछ) यहाँ, ऐसा क्यों है उपयोग करने के लिए दोस्त की घोषणा करने की कोशिश की? क्या इसका मतलब यह है कि किसी भी विशेष BT किसी भी विशेष BE कक्षा के लिए मित्र है?

टेम्पलेट्स और दोस्तों पर आईबीएम पेज में फ़ंक्शंस के लिए विभिन्न प्रकार के मित्र संबंधों के उदाहरण हैं, लेकिन वर्ग नहीं (और वाक्यविन्यास का अनुमान अभी तक समाधान पर अभिसरण नहीं हुआ है)। मैं यह समझना पसंद करूंगा कि कैसे मित्र संबंधों के प्रकार के लिए विनिर्देशों को सही तरीके से प्राप्त करना है, जिन्हें मैं परिभाषित करना चाहता हूं।

उत्तर

76
template<class T> class BE{ 
    template<class T> friend class BT; 
}; 

अनुमति नहीं है क्योंकि टेम्पलेट पैरामीटर एक-दूसरे को छाया नहीं दे सकते हैं। नेस्टेड टेम्पलेट्स में अलग-अलग टेम्पलेट पैरामीटर नाम होना चाहिए।


template<typename T> 
struct foo { 
    template<typename U> 
    friend class bar; 
}; 

इसका मतलब है कि barfoo के एक दोस्त bar के टेम्पलेट तर्कों की परवाह किए बिना। bar<char>, bar<int>, bar<float>, और कोई अन्य barfoo<char> के मित्र होंगे।


template<typename T> 
struct foo { 
    friend class bar<T>; 
}; 

इसका मतलब है कि barfoo के एक दोस्त जब bar के टेम्पलेट तर्क से मेल खाता है foo की है। केवल bar<char>foo<char> का मित्र होगा।


आपके मामले में, friend class bar<T>; पर्याप्त होना चाहिए।

+2

में मेरी कोड दोस्त वर्ग बीटी इस निर्माण के लिए दोस्त लाइन त्रुटि एक त्रुटि फेंकता : 'बीटी' एक टेम्पलेट नहीं है, भले ही इसे बाद में टेम्पलेट कक्षा बीटी { ... } –

+1

तो रहस्य यह है कि मुझे मित्र वर्ग बीटी का उपयोग करने के लिए बीटी घोषित करने की आवश्यकता है; बीई में लाइन, लेकिन टेम्पलेट दोस्त वर्ग बीटी के लिए नहीं; सहायता के लिए धन्यवाद! –

+16

अधिक विशिष्ट होने के लिए: आपको 'टेम्पलेट कक्षा बीटी; '_before_ बीई की परिभाषा घोषित करना होगा, और उसके बाद' मित्र वर्ग बीटी ;' _inside_ कक्षा बीई का उपयोग करें। –

-1

मेरे मामले में यह समाधान सही ढंग से काम करता है:

template <typename T> 
class DerivedClass1 : public BaseClass1 { 
    template<class T> friend class DerivedClass2; 
private: 
int a; 
}; 

template <typename T> 
class DerivedClass2 : public BaseClass1 { 
    void method() { this->i;} 
}; 

मुझे आशा है कि यह उपयोगी होगा।

+5

जब आप टेम्पलेट पैरामीटर को छायांकित कर रहे हों और अन्यथा DerivedClass2 के मित्र को DerivedClass1 पर उपयोग करने के लिए उपयोग नहीं कर रहे हैं तो यह समाधान सही ढंग से कैसे काम करना चाहिए? – kornman00

1

आदेश एक और एक ही प्रकार struct दोस्ती करने में:

template<typename T> 
struct Foo 
{ 
    template<typename> friend struct Foo; 
}; 

ध्यान दें कि template<typename> friend struct Foo; में आप नहीं लिखना चाहिए typenameT के बाद/class; अन्यथा यह एक टेम्पलेट पार्म त्रुटि shadowing कारण होगा।

+3

कृपया अपना उत्तर सुधारें। – swiftBoy

1

यह मानदंडों को नाम के लिए तो आप विफलता के कम अंक प्राप्त करता है, तो आवश्यक नहीं है रिफैक्टरिंग:

 template <typename _KeyT, typename _ValueT> class hash_map_iterator{ 
     template <typename, typename, int> friend class hash_map; 
     ... 
संबंधित मुद्दे