c++ - 如何正确使用 vector 范围构造函数?

标签 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)
                ^

还有其他几个……

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

最佳答案

您已成为最令人烦恼的解析的受害者,编译器将您的声明视为函数 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 向您发出警告(默认开启)。

关于c++ - 如何正确使用 vector 范围构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24101290/

相关文章:

c++ - 无法实现单例模式

c++ - 如何附加到 C++ 中的文件?

r - 如何在排序和删除元素后恢复向量的原始顺序?

c++ - 需要帮助使用 boost 在类定义中为 vector 分配空间

c++ - 复制到字节 vector 的函数反转值

c++ - 在哪里可以了解有关 C++0x 的更多信息?

c++ - 交错读写有什么保证?

c++ - 如何使用 C++ 制作内部空白的三角形?

c++ - 不同类型的特化

c++ - C++ 的自定义迭代器函数