使用模板的错误<class inputiterator =“”> string(InputIterator begin,InputIterator end); </class>

时间:2012-04-06 05:49:55

标签: c++ stl iterator stdstring istream-iterator

给出这样的代码段:

#include <iostream>
#include <iterator>
#include <fstream>
#include <string>
using namespace std;
int main(){
    ifstream file("1.txt");
    string str((istream_iterator<char>(file)),istream_iterator<char>());
    file.close();
    cout<<str<<endl;
}

代码使用istream_iterator从文件构造一个字符串。

请注意,字符串构造函数的第一个参数附有一对括号。如果省略括号,则会出错。在VC ++ 2008中,会出现链接错误。在G ++中,代码输出错误。

我对括号感到很奇怪。有什么区别和原因?

2 个答案:

答案 0 :(得分:5)

如果没有“额外”括号,你会得到C ++的“最令人烦恼的解析” - 而不是用两个istream_iterator来定义一个名为str的对象来指定它的初始值,它被解析为一个名为{的函数的声明{1}}返回str,括号中的“stuff”指定所需参数的类型。

答案 1 :(得分:1)

它看起来像是“C ++最令人烦恼的解析”问题的一个例子。看起来编译器正在使用()将语句解释为函数str的函数声明,它接受两个参数。通过添加(),您通知编译器它是一个对象而不是函数原型签名的一部分。