C++ 重载istream_迭代器——无法将左值绑定到‘;标准::基本信息流<;char>&&’;

C++ 重载istream_迭代器——无法将左值绑定到‘;标准::基本信息流<;char>&&’;,c++,C++,我做了一些研究,比如: 如果我误解了,请告诉我 我试图从文件中输入std::pair,我想使用std::istream\u迭代器> 下面是代码: std::ifstream in("file.in"); std::map<int, int> pp; pp.insert((std::istream_iterator<std::pair<int, int> >(in)), std::istream_iterator<std::pai

我做了一些研究,比如:

如果我误解了,请告诉我

我试图从文件中输入std::pair,我想使用std::istream\u迭代器>

下面是代码:

std::ifstream in("file.in");

std::map<int, int> pp; 
pp.insert((std::istream_iterator<std::pair<int, int> >(in)),
        std::istream_iterator<std::pair<int, int> >());
std::ifstream-in(“file.in”);
std::map-pp;
pp.insert((std::istream_迭代器(in)),
std::istreamu迭代器();
我按如下方式进行了重载:

std::istream & operator>>(std::istream & in, std::pair<int, int> & pa)
{ in >> pa.first >> pa.second; return in; }

std::istream & operator>>(std::istream && in, std::pair<int, int> & pa)
{ in >> pa.first >> pa.second; return in; }
std::istream&operator>>(std::istream&in,std::pair&pa)
{in>>pa.first>>pa.second;返回;}
std::istream&operator>>(std::istream&in,std::pair&pa)
{in>>pa.first>>pa.second;返回;}
以下是错误:

In file included from /usr/include/c++/4.8/iterator:66:0,
                 from No_12.cpp:7:
/usr/include/c++/4.8/bits/stream_iterator.h: In instantiation of ‘void std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::_M_read() [with _Tp = std::pair<int, int>; _CharT = char; _Traits = std::char_traits<char>; _Dist = long int]’:
/usr/include/c++/4.8/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<int, int>; _CharT = char; _Traits = std::char_traits<char>; _Dist = long int; std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_type = std::basic_istream<char>]’
No_12.cpp:23:59:   required from here
/usr/include/c++/4.8/bits/stream_iterator.h:121:17: error: cannot bind ‘std::istream_iterator<std::pair<int, int> >::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.8/iostream:40:0,
                 from /files/Nutstore/000/CPPWorkSpace/SHUCourse/DataStructures/BinarySearchTree/20130514/src/BinarySearchTree.hpp:6,
                 from /files/Nutstore/000/CPPWorkSpace/SHUCourse/DataStructures/BinarySearchTree/20130514/BinarySearchTree:3,
                 from No_12.cpp:1:
/usr/include/c++/4.8/istream:872:5: error:   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::pair<int, int>]’
     operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
在/usr/include/c++/4.8/iterator:66:0中包含的文件中,
从第12号开始。cpp:7:
/usr/include/c++/4.8/bits/stream_iterator.h:在“void std::istream_iterator::_M_read()[with _Tp=std::pair;_CharT=CharT;_Traits=std::char_Traits;_Dist=long int]”的实例化中:
/usr/include/c++/4.8/bits/stream\u iterator.h:70:17:std::istream\u iterator::istream\u iterator(std::istream\u iterator::istream\u type&)中的必填项[with(with)Tp=std::pair;_CharT=char;_traitracts=std::char\u traitracts;_Dist=long int;std::istream\u iterator::istream\u iterator::istream::istream\u type=std::basic\u istream]'
No_12.cpp:23:59:从这里开始需要
/usr/include/c++/4.8/bits/stream_iterator.h:121:17:错误:无法将'std::istream_iterator::istream_type{aka std::basic_istream}'左值绑定到'std::basic_istream&'
*_M_流>>_M_值;
^   
在/usr/include/c++/4.8/iostream:40:0中包含的文件中,
来自/files/Nutstore/000/CPPWorkSpace/shucorse/DataStructures/BinarySearchTree/20130514/src/BinarySearchTree.hpp:6,
来自/files/Nutstore/000/CPPWorkSpace/shucorse/DataStructures/BinarySearchTree/20130514/BinarySearchTree:3,
来自第12号。cpp:1:
/usr/include/c++/4.8/istream:872:5:错误:初始化'std::basic_istream&std::operator>>(std::basic_istream&&,_Tp&)[带CharT=char;_Traits=std::char_Traits;_Tp=std::pair]'
操作符>>(基本流和是、Tp和x)
我不知道我现在能做什么。。。 希望有人能给我一些建议。
谢谢。

要了解问题所在,我们必须看一看
istream\u迭代器的示例性实现(问题源于标准的要求,此处隐式显示):

这也解释了为什么变通办法会奏效

另一方面,g++似乎只显示一个通过名称解析找到的重载及其拒绝的原因(而clang++显示所有通过名称解析找到的重载及其被拒绝的原因)。g++展示的可能是“最合适的”:

模板
基本流与运算符>>(基本流与运算符,T&);
在表达式
istream\u obj>>值
对右值进行操作的情况下(如
get\u istream()>>值
),它只是一个调用另一个
操作符的包装器

这与您的问题无关(而且令人困惑)


两个变通办法:

  • 使用包装器类型包装
    std::pair
    ,以便可以在与该包装器类型关联的命名空间中定义
    运算符>>
  • 在命名空间std中插入运算符(不推荐??)

此外,我使用的是g++-4.8。在我看来,似乎找不到您的运算符(名称解析)。我会尝试获取更多信息并发布答案。为什么会出现第二次过载?在我看来这是你的问题。通常的习惯用法是只提供第一个重载。@JamesKanze不能解决问题;事实上,将它们放在clang 3.2中的名称空间std中确实解决了这个问题——尽管我不知道为什么。如果涉及到依赖名称,这将是有意义的,我仍在尝试找出其中的位置。关于包装类:这可能是从
std::pair
派生的合法情况。否则,一个
操作符std::pair()const
就可以了。(我经常这样做,我迭代的类型实际上类似于
结构{char const*key,int value;运算符std::pair()const;};
,可以静态初始化。)Woo。。。这太棒了!!!但是一个小问题。。。如果我要使用包装器类,我将不得不更改代码中的所有其他内容以完全填充此…@Adam我找到了一个解决方法,请参阅第二部分
template < class T, class CharT, class Traits, class Distance >
class istream_iterator
{
    /* ... */
    typedef std::basic_istream<CharT, Traits>  istream_type;
    istream_type* stored_istream_ptr;
    T value;

public:
    /* ... */
    istream_iterator& operator++()
    {
        *stored_istream_ptr >> value; // (A)
        return *this;
    }
    T const& operator*() const
    {
        return value;
    }
    /* ... */
};
       *_M_stream >> _M_value;
       ~~~~~~~~~~ ^  ~~~~~~~~
template< class CharT, class Traits, class T >
basic_istream<CharT,Traits>& operator>>(basic_istream<CharT,Traits>&&, T&);