मैं एक एसटीएल कंटेनर को सुंदर प्रिंट करने की कोशिश कर रहा हूं। मैं जो कोशिश कर रहा हूं वह एक डिलीमीटर से अलग कंटेनर के elemets मुद्रित करने के लिए है। हालांकि मैं कुछ समस्याओं में आया हूं।टेम्पलेट ओवरलोडिंग ओस्ट्रीम ऑपरेटर
1. जी ++ बनाम कुलपति ++
ostream& operator<<(ostream& o, const vector<string>& v) {
copy(v.begin(), v.end(), std::ostream_iterator<string>(o,","));
}
int main()
{
vector<string> s_v;
s_v.push_back("one");
s_v.push_back("two");
cout << s_v;
}
जी ++ (mingw32 पर जीसीसी संस्करण 4.4.0) संकलन कर सकते हैं यह एक ठीक काम करता है। वीसी ++ (विजुअल स्टूडियो 9) इस कोड को संकलित नहीं कर सकता है।
error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const std::string' (or there is no acceptable conversion)
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\ostream(653): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)'
1> with
1> [
यह क्यों है? क्या यह कोड अवैध है? या यह सिर्फ वीसी ++ बीसीएन वीसी ++ है?
2. अप्रयुक्त टेम्पलेट चर टूटता संकलन।
अगर अब मैं एक टेम्पलेट इस तरह ostream करने के लिए (यह नहीं किया जाता है तो बस वहाँ बैठे,) जोड़ने
template <typename T> // <----- Here
ostream& operator<<(ostream& o, const vector<string>& v) {
copy(v.begin(), v.end(), std::ostream_iterator<string>(o,","));
}
int main()
{
vector<string> s_v;
s_v.push_back("one");
s_v.push_back("two");
cout << s_v;
}
जीसीसी अब और ऑपरेटर से मेल नहीं कर सकते हैं।
error: no match for 'operator<<' in 'std::cout << s_v'
and a lot more candidates...
क्यों? टेम्पलेट अप्रयुक्त है। क्या इससे कोई फर्क पड़ता है?
संपादित करें: यह समाधान हो जाता है। मुझे ओ वापस करना पड़ा;
3. प्रयुक्त टेम्पलेट
template <typename T>
ostream& operator<<(ostream& o, const vector<T>& v) {
copy(v.begin(), v.end(), std::ostream_iterator<T>(o,","));
return o; // Edited
}
int main()
{
vector<string> s_v;
s_v.push_back("one");
s_v.push_back("two");
vector<int> i_v;
i_v.push_back(1);
i_v.push_back(2);
cout << s_v;
cout << i_v;
}
मैं टेम्पलेट प्रकार का उपयोग पता है। g ++ इसे संकलित कर सकता है लेकिन फिर अपवाद के साथ समाप्त हो जाता है।
terminate called after throwing an instance of 'std::bad_cast'
what(): std::bad_cast
कुलपति ++ बस बैठे और जीसीसी यह सब करने के देख रहा है। उनमें से किसी को संकलित नहीं करता है।
क्या कोई मेरे लिए इस चीज को स्पष्ट कर सकता है? धन्यवाद।
अपने ऑपरेटर को std namespace में परिभाषित करें। आप – PiotrNycz
अंतर देखेंगे यदि संकलक टेम्पलेट तर्क के प्रकार का अनुमान नहीं लगा सकता है, तो आपको इसे स्वयं प्रदान करना होगा। तो यदि आपके पास 'टेम्पलेट शून्य Foo() {...}' है, तो आपको 'Foo () 'का उपयोग करने की आवश्यकता है। जाहिर है, जब आप ऑपरेटर को अधिभारित करते हैं तो आप ऐसा नहीं कर सकते हैं। जब आप 't' का उपयोग करते हैं, तो कंपाइलर इसके प्रकार का अनुमान लगाने में सक्षम होता है, और यही कारण है कि यह काम करता है। –
zneak
इसके अलावा, आपका अंतिम उदाहरण [ठीक चलाता है] (http://ideone.com/mLJcTI) विचारधारा पर। आप अपने 'ऑपरेटर <<' हालांकि 'वापसी ओ;' जोड़ना चाहेंगे। यदि आपने 'cout << s_v << i_v' किया है तो यह संभवतः आपके प्रोग्राम को क्रैश करेगा। – zneak