टेम्पलेट से संबंधित त्रुटि संदेश कई बार भ्रमित हो सकते हैं। समस्या यह है कि std::ostream
में मानक लाइब्रेरी (या उस मामले के लिए कोई अन्य कंटेनर) डालने के लिए operator <<
का अधिभार परिभाषित नहीं करता है। इसलिए संकलक operator <<
के लिए उपयुक्त अधिभार खोजने में विफल रहता है, और इस विफलता को जितना संभव हो उतना सर्वोत्तम रिपोर्ट करता है (दुर्भाग्यवश दुर्भाग्यवश आपके मामले में बहुत अच्छा/पठनीय नहीं है)।
आप एक पूरे कंटेनर स्ट्रीम करने के लिए चाहते हैं, तो आपको लगता है कि के लिए std::ostream_iterator
उपयोग कर सकते हैं:
auto v = std::vector<int>{1, 2, 3};
std::copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, " "));
आप इसी छुपे त्रुटि क्यों हो रही है का सवाल है, यह पूर्ण त्रुटि संदेश का विश्लेषण करने में मदद करता है :
prog.cpp: In function ‘int main()’:
prog.cpp:13:37: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
std::cout << std::vector<int>{1,2,3};
^
In file included from /usr/include/c++/4.8/iostream:39:0,
from prog.cpp:3:
/usr/include/c++/4.8/ostream:602:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = std::vector<int>]’
operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
^
वहाँ जाहिरा तौर पर operator<<
की एक टेम्पलेट अधिभार किस प्रकार std::ostream&&
के एलएचएस तर्क और एक आरएचएस तर्क ओ लेता है एफ टेम्पलेट प्रकार; यह अस्थायी धाराओं में सम्मिलन की अनुमति देने के लिए मौजूद है। चूंकि यह एक टेम्पलेट है, यह आपके कोड में अभिव्यक्ति के लिए सबसे अच्छा मिलान बन जाता है। हालांकि, std::cout
एक लाभा है, इसलिए यह std::ostream&&
से बंधे नहीं जा सकता है। इसलिए त्रुटि।
उत्तर के लिए धन्यवाद, जो प्रश्न के पहले भाग को बताता है। मैं मुद्रण वैक्टरों के लिए भी अपना कोड रोल करता हूं। जो मैं समझ नहीं पा रहा हूं (प्रश्न का दूसरा भाग) यह है कि जब हम अधिभार नहीं पा सकते हैं तो हमें इस प्रकार की एल-रेफरी/आर-रेफ त्रुटि मिलती है। – tinlyx
@TingL ने मेरी अनुमान को त्रुटि की प्रकृति के रूप में जोड़ा। – Angew
वह ओवरलोड एक कार्यान्वयन विवरण नहीं है, लेकिन मानक 27.7.1 synopsis द्वारा अस्थायी स्ट्रीम में सम्मिलन की अनुमति देने के लिए आवश्यक है। कुछ ऐसा: 'std :: ofstream (" output.txt ") <<" हाय वहाँ \ n ";' –