gpt4 book ai didi

c++ - 重载 istream_iterator ---- 无法将左值绑定(bind)到 ‘std::basic_istream&&’

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:35 24 4
gpt4 key购买 nike

我做了一些研究,例如:

如果我误解了一些,请告诉我。

我试图从一个文件输入 std::pair 并且我想使用 std::istream_iterator >

代码如下:

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::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; }

这是错误:

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)

我不知道我现在能做什么...希望有人能给我一些建议。谢谢。

最佳答案

要了解问题所在,我们必须看一下 istream_iterator 的示例性实现(问题出自标准的要求,此处隐含地显示了这些要求):

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;
}
/* ... */
};

在行 (A) 中,运算符应用于依赖类型的对象:

  • value 的类型是 T
  • stored_istream_ptristream_type 类型,参见 typedef

根据[temp.dep.type]/8,这两种类型是依赖的。

对于表达式 A >> B 以及任何其他函数调用,首先查找函数的名称(此处:operator>>)-> 名称查找,然后从找到的函数(重载)集中选择最可行的并调用 -> 重载解析

对于运算符,会查找成员函数和非成员函数(例如您的运算符)。

在这种情况下,涉及的类型是相关的,因此 name 查找的特殊规则适用 [temp.dep.res]/1:

In resolving dependent names, names from the following sources are considered:

  • Declarations that are visible at the point of definition of the template.
  • Declarations from namespaces associated with the types of the function arguments both from the instantiation context (14.6.4.1) and from the definition context.

您的运算符已在全局命名空间中定义,该命名空间与 std::basic_istreamstd::pair 均无关联。因此,名称 解析找不到您的运算符,并且对第 (A) 行中的表达式的重载 解析失败。


这可以解释 clang 3.2 的错误消息:

stream_iterator.h:120:17: error: invalid operands to binary expression ('istream_type' (aka 'basic_istream < char, std::char_traits >') and 'std::pair')

       *_M_stream >> _M_value;
~~~~~~~~~~ ^ ~~~~~~~~

它还解释了变通办法有效的原因。

另一方面,

g++ 似乎只显示通过名称解析发现的一个重载及其拒绝它的原因(而 clang++ 显示通过名称解析找到的所有 重载以及每一个原因已被拒绝)。一个 g++ 显示可能是“最合适的”:

template< class CharT, class Traits, class T >
basic_istream<CharT,Traits>& operator>>(basic_istream<CharT,Traits>&&, T&);

据我所知,在表达式 istream_obj >> value 对右值(如 get_istream() >> 值).

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


两种解决方法:

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

关于c++ - 重载 istream_iterator ---- 无法将左值绑定(bind)到 ‘std::basic_istream<char>&&’,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16544974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com