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 के माध्यम से पाए जाते हैं।
"काम नहीं करता" ... संकलक त्रुटियों से आपका क्या मतलब है? कौन सी त्रुटियां? पहला अनुमान लगाओ ... "दोस्त" .cpp संस्करण में नहीं है। –