दिलचस्प पोस्ट
ऑरेजेस पास संदर्भ के साथ Array.prototype.fill () और नए इंस्टेंस नहीं एचटीएमएल के लिए आरटीएफ कन्वर्ट कुकीज़ और सत्र कैसे काम करते हैं? कोनेरी $ location.path काम नहीं कर रहा है टेम्पलेट्स में कीवर्ड 'टाइपनाम' और 'क्लास' का अंतर? PHP 5.4 कॉल-टाइम पास-बाय-रेफरेंस – आसान सुधार उपलब्ध है? जेपीपी में अभिव्यक्ति भाषा काम नहीं करती AngularJS intellisense Visual Studio 2015 पर काम नहीं कर रहा है AppSettings को .config फ़ाइल से मूल्य मिलता है एंड्रॉइड SQLite डेटाबेस: धीमा प्रविष्टि जावा में स्ट्रिपिंग एचटीएमएल टैग एक्सेस एसक्यूएल में विकल्प एकत्रित करें PHP सूची निर्देशिका में सभी फाइलें वेबसाइस के लिए jQuery कॉल रिटर्न "कोई ट्रांसपोर्ट" त्रुटि नहीं है त्रुटि संदेश "कोई निर्यात नहीं मिला है जो बाधा संविदा नाम से मेल खाता है"

टेम्पलेट क्लास के लिए ओवरलोडिंग मित्र ऑपरेटर <<

मैं ऑपरेटर को ओवरलोड करने की कोशिश कर रहा हूँ << एक दोस्त के रूप में एक टेम्पलेट वर्ग जोड़ी के लिए, लेकिन मैं एक कंपाइलर चेतावनी कह रही रखने के लिए

friend declaration std::ostream& operator<<(ostream& out, Pair<T,U>& v) declares a non template function 

इस कोड के लिए:

 friend ostream& operator<<(ostream&, Pair<T,U>&); 

यह कह रही सिफारिश के रूप में दूसरी चेतावनी देता है

 if this is not what you intended, make sure the function template has already been declared and add <> after the function name here 

यहाँ फ़ंक्शन परिभाषा है

 template <class T, class U> ostream& operator<<(ostream& out, Pair<T,U>& v) { out << v.val1 << " " << v.val2; } 

और यहां पूरी कक्षा है।

 template <class T, class U> class Pair{ public: Pair(T v1, U v2) : val1(v1), val2(v2){} ~Pair(){} Pair& operator=(const Pair&); friend ostream& operator<<(ostream&, Pair<T,U>&); private: T val1; U val2; }; 

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

वेब के समाधान से एकत्रित समाधान "टेम्पलेट क्लास के लिए ओवरलोडिंग मित्र ऑपरेटर <<"

आप ऑपरेटर को << एक ओस्ट्र्रीम लौटने के रूप में घोषित करते हैं, लेकिन इस पद्धति में कोई रिटर्न स्टेटमेंट नहीं है होना चाहिए:

 template <class T, class U> ostream& operator<<(ostream& out, Pair<T,U>& v) { return out << v.val1 << " " << v.val2; } 

इसके अलावा, मुझे कोई समस्या नहीं है या चेतावनी दृश्य स्टूडियो 2008 के अंतर्गत आपके कोड को स्तर 4 पर चेतावनियों के साथ संकलित कर रहा है। ओह, शास्त्रीय लिंकर त्रुटियां हैं, लेकिन यह स्पष्ट रूप से टेम्पलेट फ़ंक्शन परिभाषा को वर्ग घोषणापत्र में स्थानांतरित करके, सी ++ अकसर किये गए सवाल में

मेरा परीक्षण कोड:

 #include <iostream> using namespace std; template <class T, class U> class Pair{ public: Pair(T v1, U v2) : val1(v1), val2(v2){} ~Pair(){} Pair& operator=(const Pair&); friend ostream& operator<<(ostream& out, Pair<T,U>& v) { return out << v.val1 << " " << v.val2; } private: T val1; U val2; }; int main() { Pair<int, int> a(3, 4); cout << a; } 

आप उस टेम्पलेट के एक एकल उदाहरण (सामान्य शब्दों में "विशेषज्ञता" कहा जाता है) बनाना चाहते हैं आप इसे निम्नलिखित तरीके से करते हैं

 template <class T, class U> class Pair{ public: Pair(T v1, U v2) : val1(v1), val2(v2){} ~Pair(){} Pair& operator=(const Pair&); friend ostream& operator<< <> (ostream&, Pair<T,U>&); private: T val1; U val2; }; 

क्योंकि कंपाइलर पैरामीटर सूची से जानता है कि टेम्पलेट तर्क T और U , आपको <...> बीच में डाल देना नहीं है, इसलिए उन्हें खाली छोड़ा जा सकता है ध्यान दें कि आपको operator<< घोषणा operator<< ऊपर Pair टेम्पलेट के ऊपर Pair है, जैसे:

 template <class T, class U> class Pair; template <class T, class U> ostream& operator<<(ostream& out, Pair<T,U>& v); // now the Pair template definition... 

सरल इनलाइन संस्करण:

 template<typename T> class HasFriend { private: T item; public: ~HasFriend() {} HasFriend(const T &i) : item(i) {} friend ostream& operator<<(ostream& os, const HasFriend<T>& x) { return os << "s(" << sizeof(x) << ").op<<" << x.item << endl; } }; 

संशोधित टेम्पलेट संस्करण:

 template<template<typename /**/> class U, typename V> ostream& operator<<(ostream &os, const U<V> &x) { return os << "s(" << sizeof(x) << ").op<<" << x.item << endl; } template<typename T> class HasFriend { private: T item; public: ~HasFriend() {} HasFriend(const T &i) : item(i) {} friend ostream& operator<<<>(ostream&, const HasFriend<T>&); };