1

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

vector<pair<string,long>> test;

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

错误 1 ​​错误 C2679: 二进制 '<<' : 未找到采用 'const std::pair<_Ty1,_Ty2>' 类型的右侧操作数的运算符(或没有可接受的转换) C:\Program Files (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);
4

2 回答 2

2

没有。operator <<_ std::pair您不能简单地使用ostream_iteratorwith std::pair

您可以使用其他东西,或编写从 派生的类pair,或存储pair和使用它。您不能在std命名空间中编写重载,因为它会导致未定义的行为,并且您不能在全局命名空间中重载此运算符,因为ADL不会找到正确的重载(如果您使用 stl 算法,如copy, ostream_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;
   }
}
于 2013-06-06T07:44:13.157 回答
1

您可以简单地重载std::ostream& operator<<

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

或者看看漂亮的打印 C++ 容器

于 2013-06-06T07:55:06.040 回答