我正在使用以下代码(使用命名空间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 会产生编译错误?
答案 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中,没有这样的问题,因此它们按预期工作。