带有元组C ++的iostream_iterator问题

时间:2015-03-18 21:06:13

标签: c++11 stl copy tuples iostream

我想使用iostream_iterator作为元组。 我有过载输入操作符>>对于元组。 但编译器会出现编译错误。     

#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <tuple>

using namespace std;
using rec_t= tuple<int, string>;

istream& operator>>(istream& strm, rec_t& r) {
strm>>get<0>(r)>>get<1>(r);
return strm;
}
int main() {
    int n;
    cin>>n;
    vector<rec_t> ar(n);
    copy_n(istream_iterator<rec_t>(cin), n, begin(ar));
    return 0;
}

编译器错误消息是:

-------------- Build:Debug(编译器:GNU GCC编译器)---------------

g++ -Wall -fexceptions -std=c++11 -g  -c main.cpp -o obj/Debug/main.o
In file included from /usr/include/c++/4.9/iterator:66:0,
                 from main.cpp:4:
/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::tuple<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >; _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::tuple<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >; _CharT = char; _Traits = std::char_traits<char>; _Dist = long int; std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_type = std::basic_istream<char>]’
main.cpp:18:39:   required from here
/usr/include/c++/4.9/bits/stream_iterator.h:121:17: error: cannot bind ‘std::istream_iterator<std::tuple<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::istream_type {aka std::basic_istream<char>}’ lvalue to ‘std::basic_istream<char>&&’
      *_M_stream >> _M_value;
                 ^
In file included from /usr/include/c++/4.9/iostream:40:0,
                 from main.cpp:2:
/usr/include/c++/4.9/istream:872:5: note: initializing argument 1 of ‘std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&&, _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = std::tuple<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]’
     operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
     ^
Process terminated with status 1 (0 minute(s), 1 second(s))
1 error(s), 3 warning(s) (0 minute(s), 1 second(s))

1 个答案:

答案 0 :(得分:1)

您已经成为ADL&#34;依赖于参数的查找的受害者&#34;。

你应该去查一下,因为那里有很好的解释。 基本上,您的operator >>应与rec_t位于同一名称空间。

但它不是 - rec_t位于namespace std(因为它真的是std::tuple<int, std::string>),而operator >>位于全局命名空间中。