6

我想通过使用其范围构造函数将文本文件中的所有行加载到 avector<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)
                ^

和其他几个...

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

4

1 回答 1

6

您已成为最令人烦恼的 Parse 的受害者,编译器将您的声明视为strings返回 a的函数vector<string>,并接受两个参数:

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

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

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

strings或者,在 C++11 中,对构造函数使用花括号

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

注意-Wvexing-parse:Clang 通过(默认开启)警告您。

于 2014-06-07T20:46:49.393 回答