2012-07-30 13 views
5

एक टेम्पलेट वर्ग के एक दोस्त समारोह की घोषणा करने का सही तरीका (एसटीडी के लिए :: ostream & ऑपरेटर < <) एक .cpp फ़ाइल में क्या है?सी ++: ऑपरेटर के लिए एक टेम्पलेट वर्ग में दोस्त समारोह <<

मेरे वर्तमान कार्यान्वयन काम नहीं करता:

// MyTest.h 
template<class T, unsigned int TSIZE> class MyTest 
{ 
    inline friend std::ostream& operator<< <T, TSIZE> (std::ostream &lhs, const MyTest<T, TSIZE> &rhs); 
}; 

// MyTest.cpp 
template<class T, unsigned int TSIZE> inline friend std::ostream& operator<< <T, TSIZE> (std::ostream &lhs, const MyTest<T, TSIZE> &rhs) 
{ 
    // IMPLEMENTATION 
} 

आपको बहुत बहुत धन्यवाद!

+0

"काम नहीं करता" ... संकलक त्रुटियों से आपका क्या मतलब है? कौन सी त्रुटियां? पहला अनुमान लगाओ ... "दोस्त" .cpp संस्करण में नहीं है। –

उत्तर

7

operator<< <T, TSIZE> को संदर्भित करने के लिए, जो एक टेम्पलेट विशेषज्ञता है, प्राथमिक टेम्पलेट की घोषणा दिखाई देनी चाहिए। बदले में operator<< को MyTest की घोषणा की आवश्यकता है क्योंकि यह पैरामीटर के रूप में दिखाई देता है।

// Declare MyTest because operator<< needs it 
template<class T, unsigned int TSIZE> class MyTest; 

// Declare primary template 
template<class T, unsigned int TSIZE> 
inline std::ostream& operator<<(std::ostream& lhs, const MyText<T, TSIZE>& rhs); 

template<class T, unsigned int TSIZE> class MyTest 
{ 
    // Specialization MyTest<T, TSIZE> only declares 
    // specialization operator<< <T, TSIZE> as friend 
    // Note that you can just use '<>' to designate the specialization, 
    // template parameters are deduced from the argument list in this case 
    inline friend std::ostream& operator<< <> (std::ostream &lhs, const MyTest<T, TSIZE> &rhs); 
}; 

परिभाषा आपको उन घोषणाओं से मेल खाना चाहिए। ध्यान दें कि operator<< एक टेम्पलेट है, इसकी परिभाषा सभी समानता में शीर्षलेख में होनी चाहिए।

एक विकल्प जिसके लिए उन सभी प्रीपेप्टिव घोषणाओं को लिखने के लिए कम काम की आवश्यकता होती है, MyTest<T, TSIZE> के लिए पूरे टेम्पलेट को एक दोस्त के रूप में घोषित करने के लिए है, न केवल विशेषज्ञता जो MyTest<T, TSIZE> लेती है।

// in MyTest definition 
template<typename U, unsigned USIZE> 
inline friend std::ostream& operator<<(std::ostream& lhs, const MyTest<U, USIZE>& rhs); 

परिभाषा आप भी इस तरह के एक घोषणा से मेल खाना चाहिए (टेम्पलेट मापदंडों के नाम से मेल खाते घोषणाओं और परिभाषा से कोई संबंध नहीं)।

पूर्णता के लिए, मैं उल्लेख करूंगा कि जब क्लास टेम्पलेट के मित्र की बात आती है तो विकल्प क्लास टेम्पलेट परिभाषा में इसे परिभाषित करना है। यह एक गैर-टेम्पलेट मित्र फ़ंक्शन को परिभाषित करता है जो प्रत्येक विशेषज्ञता के लिए अद्वितीय है।

// in MyTest definition 
friend std::ostream& operator<<(std::ostream& lhs, MyTest const& rhs) 
{ /* implementation */ } 

यह कार्यों का उल्लेख करना असंभव है (उदाहरण के लिए &ns::operator<< काम नहीं करता है, अन्य विकल्प के विपरीत) और वे केवल ADL के माध्यम से पाए जाते हैं।

0

यह मूल पोस्ट क्या चाहता था पूरी तरह से स्पष्ट नहीं है।

// Some template class. 
template<class T, unsigned int TSIZE> class MyTest { }; 

// Some template function. 
template<class T, unsigned int TSIZE> std::ostream& operator<< (std::ostream &lhs, const MyTest<T, TSIZE> &rhs) 
{ 
    // IMPLEMENTATION 
} 

अब यह क्योंकि इस समारोह My test की रक्षा की वस्तुओं के उपयोग की जरूरत वर्ग के मित्र के रूप में इस टेम्पलेट समारोह की घोषणा करने के लिए आवश्यक है: मुझे लगता है कि यह निम्नलिखित चाहते थे ग्रहण करेगा। यह निम्नलिखित परिभाषा के साथ प्राप्त किया जा सकता है:

template<class T, unsigned int TSIZE> class MyTest 
{ 
    template<class T1, unsigned int TSIZE1> 
    friend std::ostream& operator<< (std::ostream &lhs, const MyTest<T1, TSIZE1> &rhs); 
}; 

खाका हैडर friend घोषणा के सामने की जरूरत है क्योंकि यह एक असंबंधित टेम्पलेट समारोह, कि वर्तमान टेम्पलेट वर्ग के हैं नहीं करता है।

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