在cpp中将单词从一个文件复制到另一个文件

8

我正在尝试在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>{} };

我曾认为在C++中初始化对象时选择使用()还是{}只是个人喜好,但我现在意识到我是错的。有人可以向我解释一下吗?

实际上,set<string> words( istream_iterator<string>{ ifs }, istream_iterator<string>{} ); 就足够了。 - Slava
1个回答

2
在第一个代码片段中,set<string> words(istream_iterator<string>(ifs), istream_iterator<string>())这一行被解析为声明了一个名为words的函数,该函数有两个参数:istream_iterator<string> ifs和一个未命名的类型为istream_iterator<string>的参数,并返回一个set<string>。因此会导致编译错误。而第二个代码片段无法被解析为函数声明,所以可以正常工作。

为什么 istream_iterator<string>(ifs) 被解析为一种类型? - Slava
@Slava 整个表达式可以解析为一个带有两个参数(istream_iterator<string> ifsistream_iterator<string>)的函数声明,这正是发生的事情。为什么?因为C++标准是这样规定的(即使在这种情况下并没有太多意义)。 - kraskevich
1
@Slava:不应该?根据谁的说法?肯定不是C++标准。http://en.wikipedia.org/wiki/Most_vexing_parse - Benjamin Lindley
@Slava 为什么不行呢?括号中的 ifs 只是被忽略了。 - kraskevich
1
@BenjaminLindley 你看了那个维基百科吗?ifstream_iterator()可以被视为返回ifstream_iterator的函数,但ifstream_iterator(ifs)不行。 - Slava
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接