使用istreambuf_iterator<>将文件内容转换为字符串流

时间:2012-06-12 10:16:36

标签: c++ visual-c++ compiler-errors

我正在使用以下代码(使用命名空间std)将文件内容转换为字符串。

代码1

string fileToString(const string& filename)
{
    ifstream file(filename, ios::binary);
    if (!file) return "";
    string str(istreambuf_iterator<char>(file),
               (istreambuf_iterator<char>()));
    return str;
}

我发现上面的代码工作(我将string :: size()与Windows资源管理器中找到的实际文件大小匹配)很奇怪,但以下代码没有:

代码2

string fileToString(const string& filename)
{
    ifstream file(filename, ios::binary);
    if (!file) return "";
    string str(istreambuf_iterator<char>(file),
               istreambuf_iterator<char>());
    return str;
}

注意第二个参数周围缺少括号。第二个函数给出以下编译器错误:

  

1错误C2664:   “的std :: basic_string的&LT; _Elem,_Traits,_AX&GT; :: basic_string的(常量   的std :: basic_string的&LT; _Elem,_Traits,斧&GT; &amp;)':无法转换参数1   来自'std :: string( _cdecl   *)(标准:: istreambuf_iterator&LT; _Elem,_Traits&GT;,的std :: istreambuf_iterator&LT; _Elem,性状&GT;   ( _cdecl *)(void))'to'const std :: basic_string&lt; _Elem,_Traits,_Ax&gt; &安培;'

     

2 IntelliSense:没有合适的构造函数可供转换   “std :: string(std :: istreambuf_iterator&gt;   file,std :: istreambuf_iterator&gt; (*)())”   到“std :: basic_string,   的std ::分配器&gt;“中

我在Windows XP SP3上使用 Visual Studio 2010 ,Win32控制台应用程序。

令我惊讶的是,以下代码按预期编译并运行:

代码3

string fileToString(const string& filename)
{
    ifstream file(filename, ios::binary);
    if (!file) return "";
    return string(istreambuf_iterator<char>(file),
                  istreambuf_iterator<char>());
}

为什么代码2 会产生编译错误?

1 个答案:

答案 0 :(得分:3)

  

为什么Code 2会产生编译错误?

代码2产生编译错误,因为在代码2中,以下行声明了一个函数:

string str(istreambuf_iterator<char>(file),
           istreambuf_iterator<char>());

它声明了一个函数。函数名称为str。返回类型为string。该函数有两个参数:

  • 第一个参数的类型为istreambuf_iterator<char>
  • 第二个参数是istreambuf_iterator<char> (*)()类型,它是函数指针类型,它返回istreambuf_iterator<char>并且不带参数。

因此在代码2中,您返回一个名为str的函数。由于它无法转换为string,它是函数fileToString的返回类型,因此它会产生编译错误。

在Code1和Code3中,没有这样的问题,因此它们按预期工作。