【发布时间】:2023-03-06 06:26:01
【问题描述】:
我正在使用以下代码(使用命名空间 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>::basic_string(const std::basic_string<_elem>Ax> &)' : 无法转换参数 1 来自 'std::string (_cdecl *)(std::istreambuf_iterator<_elem>,std::istreambuf_iterator<_elem>Traits> (_cdecl *)(void))' 到 'const std::basic_string<_elem> &'
2 IntelliSense:不存在合适的构造函数来转换 “标准::字符串(标准::istreambuf_iterator> 文件,std::istreambuf_iterator> (*)())" 到“std::basic_string, std::allocator>"
我正在使用 Visual Studio 2010,Windows XP SP3 上的 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会产生编译错误?
【问题讨论】:
-
前段时间我问了一个非常相似的问题:stackoverflow.com/questions/8927939/…
标签: c++ visual-c++ compiler-errors