如何正确使用向量范围构造函数?

时间:2014-06-07 20:27:55

标签: c++ c++11 vector fstream most-vexing-parse

我想通过使用范围构造函数将文本文件中的所有行加载到vector<string,然后通过cout输出:

#include<iostream>
#include<fstream>
#include<vector>
#include<iterator>

using namespace std;

int main()
{
  ifstream file("file.txt");
  vector<string> strings(istream_iterator<string>(file) , istream_iterator<string>());

  for(auto s : strings)
    cout << s << endl;

  return 0;
}

当尝试编译上面的代码时,我得到了几个错误,例如:

error: no matching function for call to ‘begin(std::vector<std::basic_string<char> > (&)    (std::istream_iterator<std::basic_string<char> >, std::istream_iterator<std::basic_string<char> > (*)    ()))’
   for(auto s : strings)
                ^

和其他几个......

我想我在这里遗漏了一些明显的东西,有人可以帮忙吗?

1 个答案:

答案 0 :(得分:6)

你已经成为Most Vexing Parse的牺牲品,编译器将你的声明看作一个函数strings,返回一个vector<string>,带有两个参数:

  • istream_iterator<string>名为file
  • 一个未命名的指向函数的指针,该函数不带参数并返回istream_iterator<string>

要消除烦恼的解析,请在第一个参数周围使用一对额外的括号:

vector<string> strings((istream_iterator<string>(file)) , istream_iterator<string>());
//                     ^                              ^

或者,在C ++ 11中,对strings构造函数

使用花括号
vector<string> strings{istream_iterator<string>(file) , istream_iterator<string>()};
//                    ^                                                           ^

注意:Clang通过-Wvexing-parse警告您(默认情况下已启用)。