【问题标题】:Copying words from one file to another in cpp在cpp中将单词从一个文件复制到另一个文件
【发布时间】:2015-02-12 17:30:43
【问题描述】:

我正在尝试在 cpp 中将单词从一个文件复制到另一个文件,这是我的代码:

int main()
{

    string from, to;

    cin >> from >> to;

    ifstream ifs(from);

    ofstream ofs(to);

    set<string> words(istream_iterator<string>(ifs), istream_iterator<string>());
    copy(words.begin(), words.end(), ostream_iterator<string>(ofs, "\n"));

    return !ifs.eof() || !ofs;
}

这样我得到一个编译错误:

expression must have class type

在我调用 copy() 的那一行

如果我将迭代器的构造更改为以下内容,它将起作用:

set<string> words{ istream_iterator<string>{ ifs }, istream_iterator<string>{} };

我认为在 cpp 中初始化对象时在 () 和 {} 之间进行选择只是一个选择问题,但我想我错了。 谁能给我解释一下?

【问题讨论】:

  • 其实set&lt;string&gt; words( istream_iterator&lt;string&gt;{ ifs }, istream_iterator&lt;string&gt;{} );就够了

标签: c++ file


【解决方案1】:

在第一个代码 sn-p 中,set&lt;string&gt; words(istream_iterator&lt;string&gt;(ifs), istream_iterator&lt;string&gt;()) 行被解析为函数 words 的声明,该函数有两个参数:istream_iterator&lt;string&gt; ifs 和类型为 istream_iterator&lt;string&gt; 的未命名参数,并返回 set&lt;string&gt; .这就是它给出编译错误的原因。第二个不能被解析为函数声明,所以它可以正常工作。

【讨论】:

  • 为什么istream_iterator&lt;string&gt;(ifs)被解析为类型?
  • @Slava 整个表达式可以被解析为一个带有两个参数(istream_iterator&lt;string&gt; ifsistream_iterator&lt;string&gt;) 的函数的声明,这正是发生的事情。为什么?嗯,因为 C++ 标准是这样说的(即使在这种情况下没有多大意义)。
  • istream_iterator&lt;string&gt;(ifs) 不应该被解析为参数,这就是问题
  • @Slava:不应该吗?根据谁?当然不是 C++ 标准。 en.wikipedia.org/wiki/Most_vexing_parse
  • @BenjaminLindley 你读过那个维基吗? ifstream_iterator() 可以认为是返回 ifstream_iterator 的函数,但 ifstream_iterator(ifs) 不能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 2020-07-30
相关资源
最近更新 更多