【问题标题】:How to properly use a vector range constructor?如何正确使用向量范围构造函数?
【发布时间】:2014-07-28 20:56:27
【问题描述】:

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

还有其他几个……

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

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/7007817/…
  • 知道了。我应该删除这个问题还是自己回答?
  • 尝试将至少一个迭代器声明为单独的变量,这样可以消除歧义。伙计,这真的很糟糕。
  • 如果你有一个好的答案,那就去吧。

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


【解决方案1】:

您已成为最令人烦恼的解析的受害者,编译器将您的声明视为一个函数 strings 返回一个 vector&lt;string&gt;,并接受两个参数:

  • istream_iterator&lt;string&gt; 称为 file
  • 一个未命名的指向函数的指针,不带参数并返回istream_iterator&lt;string&gt;

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

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(默认开启)向您发出警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 2016-10-06
    相关资源
    最近更新 更多