【问题标题】:template argument for ostream_iterator-each element is pairostream_iterator-每个元素的模板参数是对
【发布时间】:2013-06-06 07:42:30
【问题描述】:

我正在尝试使用 ostream_iterator 将成对向量写入文件。ostream_iterator 需要在声明时应用模板参数。 向量定义为-

vector<pair<string,long>> test;

当我将 pair 作为模板传递给 ostream_iterator 时,它会显示错误 -

错误 1 ​​错误 C2679: 二进制 '' 类型的右侧操作数的运算符(或没有可接受的转换) C:\Program文件 (x86)\Microsoft Visual Studio 10.0\VC\include\iterator 531 1 个词分段

在这种情况下,正确的论点可能是什么?

编辑- 代码片段

vector<pair<string,long>> t;
......
//t is filled up with elements 
ostream_iterator<pair<string,long>> output_iterator(out, "\n");
std::copy(t.begin(), t.end(), output_iterator);

【问题讨论】:

标签: c++ templates iterator std-pair


【解决方案1】:

std::pair 没有 operator &lt;&lt;。您不能简单地将ostream_iteratorstd::pair 一起使用。

您可以使用其他东西,或编写派生自pair 或存储pair 的类并使用它。您不能在 std 命名空间中编写重载,因为它会导致未定义的行为,并且您不能在全局命名空间中重载此运算符,因为 ADL 将找不到正确的重载(如果您使用 stl 算法,如 copyostream_iterator )。

简单地说,这样的东西会很好用

#include <iostream>
#include <utility>
#include <algorithm>
#include <iterator>

int main()
{
   std::vector<std::pair<int, int>> vec =
   {
      {1,1},
      {2,2}
   };
   for (const auto& p : vec)
   {
      std::cout << p.first << " " << p.second << std::endl;
   }
}

【讨论】:

  • 如果我的每个元素都是向量,我会得到同样的错误。你能建议将这样的变量写入文件的替代方法吗?我原本想将哈希图写入文件,但这似乎更简单。谢谢
  • 谢谢。所以,我实际使用的对是 pair> 。你认为我应该如何存储它,以便在阅读时正确识别向量回档。
  • @code4fun 这应该是你的决定。可能是一些标签,或者分隔符,不知道。
  • 您能解释一下为什么在您的代码中使用“const”作为自动引用变量吗?我认为我们不能将其声明为 const。谢谢
  • @code4fun 自动将p 推断为某种类型(此处为std::pair&lt;int, int&gt;),此处const auto&amp; 表示const std::pair&lt;int, int&gt;&amp;
【解决方案2】:

你可以简单地重载std::ostream&amp; operator&lt;&lt;:

std::ostream& operator<<(std::ostream& o, const pair<string,long>& p)
{
  return o << p.first << " " << p.second;
}

或者看看pretty print C++ containers

【讨论】:

    猜你喜欢
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多