2012-02-19 53 views
0

文件流类不能接受string作为其construtor的说法,只有C-字符串。文件流构造

char fname[] = "file"; 
string fname_string ("file"); 
ifstream ifs (fname); //OK 
ifstream ifs (fname_string); //Error 

这是为什么?那有什么意义吗?

回答

2

因为在C++ 03中,std:istream没有一个以std::string作为参数的构造函数。但是,in C++11, it has!

所以只要你使用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 
+0

当然,我知道这一点。但为什么?为什么C++ Stream Library的作者没有创建带字符串作为参数的构造函数? – mikithskegg 2012-02-19 12:09:27

+0

感谢您提供有关C++ 11的信息。 – mikithskegg 2012-02-19 12:10:24

+2

@mikithskegg:他们只是忘了它。他们也是人类。 :-) – Nawaz 2012-02-19 12:10:28

2

如果你想传递的一个std::string对象,你应该使用.c_str()成员函数。这会将其转换为旧式字符串。

的ifstream的构造函数只需要旧风格的字符串。我猜测,可能ifstream的不允许隐式转换,因为它可以使时真不表示文件名的字符串对象将会被隐式转换会出现一堆恼人的麻烦的。

+2

不,这不关乎安全。流类只是在*之前设计的,而不是'std :: string'。 – 2012-02-19 12:11:56

+0

但在2003年,这两个类已经存在。 – mikithskegg 2012-02-19 12:14:21