【问题标题】:Passing a std::vector<char> constructed from istreambuf_iterator传递从 istreambuf_iterator 构造的 std::vector<char>
【发布时间】:2017-08-04 14:05:05
【问题描述】:

我有以下代码:

std::ifstream ifs(fileName, std::ios_base::in | std::ios_base::binary);
std::vector<char> vecdata(std::istreambuf_iterator<char>(ifs), 
                          std::istreambuf_iterator<char>());
image->setData(std::move(vecdata));

setData 声明如下:

void Image::setData(std::vector<char> && data);

我有以下错误:

reader.cpp:752: 错误:没有匹配的调用函数

'Image::setData(std::vector (&)(std::istreambuf_iterator >, std::istreambuf_iterator > (*)()))'

image->setData(std::move(vecdata));
                                 ^

候选人是:

image.h:12: void Image::setData(std::vector&&)

我使用的是 gcc 4.91

使用 gcc 5.4 的 MCVE,行为相同:http://rextester.com/QYA50737

这是一个 gcc 错误吗?

谢谢

【问题讨论】:

  • 最令人烦恼的 Parse 是关键。
  • 我通过搜索最棘手的解析得到了这个想法。第二个参数可以解释为指向返回 istreambuf_iterator 的函数的未命名指针。但是如何将第一个参数解释为函数声明参数呢?对我来说它只能是一个右值

标签: c++ c++11 gcc stl


【解决方案1】:

你得到了最令人烦恼的解析:使用 {} 而不是 ()

std::vector<char> vecdata{std::istreambuf_iterator<char>(ifs), 
                          std::istreambuf_iterator<char>()};

【讨论】:

  • 不是std::istreambuf_iterator&lt;char&gt;(ifs) 一个值,即不是一个类型?
  • @PiotrNycz 不,在 OP 的代码中,它是一个名为 ifs 的变量,其类型为 std::istreambuf_iterator&lt;char&gt;
  • @mch 不是变量;一个参数。
  • std::istreambuf_iterator&lt;char&gt;(ifs)怎么可能是参数声明??
  • @galinette:int main(int (argc), char**(argv)) 有效。虽然这里不需要额外的父母,但对于int (*a)[42]这样的情况
猜你喜欢
  • 1970-01-01
  • 2011-02-23
  • 2013-09-21
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
相关资源
最近更新 更多