文件流类不能接受string
作为其构造符的参数,只能接受C字符串。
char fname[] = "file";
string fname_string ("file");
ifstream ifs (fname); //OK
ifstream ifs (fname_string); //Error
为什么会这样?这有道理吗?
因为在C++03中,std:istream
没有以std::string
为参数的构造函数。然而,在C++11中,它有!
所以,只要你使用C++03,你就必须这样做:
std::ifstream ifs (fname_string.c_str()); //Ok in C++03 and C++11 both!
只有在C++11中,你才能做到这一点:
std::ifstream ifs (fname_string); //Ok in C++11 only
如果要传递std::string
的对象,则应使用.c_str()
成员函数。这将把它转换成一个旧式字符串。
ifstream构造函数只接受旧式字符串。我猜ifstream可能不允许隐式转换,因为当真正不代表文件名字符串的对象被隐式转换时,它可能会引起一堆烦人的麻烦。