What's wrong about this source code?Error messages generated:Code:#include <iostream> #include <vector> #include <iterator> using namespace std; int main() { pair<string, int> si; istream_iterator<decltype(si)> in(cin), eos; vector<decltype(si)> vsi; if(in != eos) { vsi.push_back(*in); ++in; while(in != eos) { vsi.push_back(*in); ++in; } } else { cerr << "No data?!" << endl; // no input! Warn the user return EXIT_FAILURE; // indicate failure } for(const auto& p : vsi) cout << p.first << " " << p.second << endl; return EXIT_SUCCESS; }It looks like that the pair type has not overloaded the operator>>.Code:In file included from /usr/include/c++/4.9/iterator:66:0, from test.cpp:9: /usr/include/c++/4.9/bits/stream_iterator.h: In instantiation of ‘void std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::_M_read() [with _Tp = std::pair<std::basic_string<char>, int>; _CharT = char; _Traits = std::char_traits<char>; _Dist = long int]’: /usr/include/c++/4.9/bits/stream_iterator.h:70:17: required from ‘std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_iterator(std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_type&) [with _Tp = std::pair<std::basic_string<char>, int>; _CharT = char; _Traits = std::char_traits<char>; _Dist = long int; std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_type = std::basic_istream<char>]’ test.cpp:16:39: required from here /usr/include/c++/4.9/bits/stream_iterator.h:121:17: error: no match for ‘operator>>’ (operand types are ‘std::istream_iterator<std::pair<std::basic_string<char>, int> >::istream_type {aka std::basic_istream<char>}’ and ‘std::pair<std::basic_string<char>, int>’) *_M_stream >> _M_value; ^ /usr/include/c++/4.9/bits/stream_iterator.h:121:17: note: candidates are: In file included from /usr/include/c++/4.9/iostream:40:0, from test.cpp:6: /usr/include/c++/4.9/istream:120:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__istream_type& (*)(std::basic_istream<_CharT, _Traits>::__istream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] operator>>(__istream_type& (*__pf)(__istream_type&)) ^ /usr/include/c++/4.9/istream:120:7: note: no known conversion for argument 1 from ‘std::pair<std::basic_string<char>, int>’ to ‘std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&) {aka std::basic_istream<char>& (*)(std::basic_istream<char>&)}’ /usr/include/c++/4.9/istream:124:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__ios_type& (*)(std::basic_istream<_CharT, _Traits>::__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>; std::basic_istream<_CharT, _Traits>::__ios_type = std::basic_ios<char>] operator>>(__ios_type& (*__pf)(__ios_type&)) ^
Am I right? If true, is there a rationale behind this choice? Possible workarounds? TIA
Best regards