2009-09-22 7 views
9

मैं विभिन्न टेम्पलेट पैरामीटर के साथ टेम्पलेट क्लास के संरक्षित चर तक पहुंचने का प्रयास कर रहा हूं। टेम्पलेट मानकों के साथ एक दोस्त ने घोषणा निम्न त्रुटि दे रहा है:टेम्पलेट मित्रता

कई टेम्प्लेट पैरामीटर सूचियों की अनुमति नहीं है

मेरे कोड

template<class O_, class P_> 
class MyClass { 
    //multiple template parameter lists are not allowed 
    template<class R_> friend class MyClass<R_, P_> 
    //syntax error: template< 
    friend template<class R_> class MyClass<R_, P_> 

public: 
    template<class R_> 
    ACopyConstructor(MyClass<R_, P_> &myclass) : 
     SomeVariable(myclass.SomeVariable) 
    { } 

protected: 
    O_ SomeVariable; 
}; 

है अगर मैं संरक्षण और दोस्त घोषणा यह काम करता है हटा दें।

+0

MyClass स्वयं का मित्र है? !! – AraK

+3

MyClass MyClass के समान वर्ग नहीं है, इसलिए, यह इसके संरक्षित चर तक पहुंच नहीं सकता है। –

+0

अरक इस तरह के 'MyClass' नहीं है। –

उत्तर

10
मानक से

: "। एक दोस्त ने टेम्पलेट घोषित नहीं किया जाएगा आंशिक विशेषज्ञताओं" 14.5.3/9 [temp.friend], है, तो आप केवल 'दोस्ती' कर सकते हैं एक वर्ग टेम्पलेट या विशिष्ट के सभी instantiations पूर्ण विशेषज्ञता।

अपने मामले में, जैसा कि आप एक निःशुल्क टेम्पलेट पैरामीटर के साथ तत्कालता के साथ दोस्त बनना चाहते हैं, आपको क्लास टेम्पलेट को मित्र के रूप में घोषित करने की आवश्यकता है।

उदा

template< class A, class B > friend class MyClass; 
0

निम्नलिखित काम करता है, प्रभावी रूप से सभी MyClass प्रकारों को एक-दूसरे के साथ मित्र होने के लिए प्रभावी रूप से घोषित करता है।

template<class O_, class P_> 
class MyClass { 
    template<class R_, class P_> friend class MyClass; 

public: 
    template<class R_> 
    ACopyConstructor(MyClass<R_, P_> &myclass) : 
     SomeVariable(myclass.SomeVariable) 
    { } 

protected: 
    O_ SomeVariable; 
};