我正在使用以下代码(使用命名空间 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会产生编译器错误?