0

我正在使用以下代码(使用命名空间 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<_Elem,_Traits,_Ax>::basic_string(const std::basic_string<_Elem,_Traits, Ax> &)' : 无法从 'std::string ( _cdecl *)转换参数 1 (std::istreambuf_iterator<_Elem,_Traits>,std::istreambuf_iterator<_Elem, Traits> ( _cdecl *)(void))' to 'const std::basic_string<_Elem,_Traits,_Ax> &'

2 IntelliSense:不存在合适的构造函数来将“std::string (std::istreambuf_iterator> file, std::istreambuf_iterator> (*)())”转换为“std::basic_string, std::allocator>”

我在 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>());
}

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

4

1 回答 1

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 中,没有这样的问题,因此它们按预期工作。

于 2012-06-12T10:27:28.710 回答