2012-04-01 63 views
0

我曾尝试使用下面的代码片断:ifstream的在C++中不接受可变

int main() 
{ 
string location_file ("test.txt"); 
string data; 

ifstream file (location_file); 
getline (file, data); 
file.close(); 

cout << data; 
return 0; 
} 

但它不会工作。现在,如果我使用“ifstream文件(”test.txt“)”它会。为什么?最后它不是一回事吗?

回答

2

的问题是,ifstream的构造不接受string作为参数,但仅接受char const*。现"test.txt"类型char const[9]根据类型的促销规则衰减到char const*,因此它的工作。但是,没有从stringchar const*的隐式转换,因此您的代码不起作用。

要解决你的代码,以构建你的流:

ifstream file(location_file.c_str()); 
+0

@pmr:关于你的编辑:包含初始化符*的声明是一个定义(除少数例外,但这不是其中之一) – celtschk 2012-04-01 13:31:18

+0

Upvoted for the explanation。Did not know that。谢谢。 – MKII 2012-04-01 13:52:06

+0

@celtschk好的。这是否意味着定义在引用函数/ cl时有所不同驴的定义和何时用于名称? – pmr 2012-04-01 13:55:57

5

因为在早期版本的C++标准,有(不快)没有构造函数ifstream是花了string,所以你要做的:

ifstream file(location_file.c_str()); 
+1

不莫名其妙地:当时的想法是不同的部分大多是相互独立的,所以你可以在同一时间使用'fstream's无使用'string's。一个采用'string'的构造函数会将'fstream'和'string'耦合起来。这可能不是一个好决定(我认为不是这样),但它绝对不是无法解释的。 – celtschk 2012-04-01 13:28:50

+0

@celtschk:有趣的。那么,我会调整我的措辞...... – 2012-04-01 13:33:59

+0

另一种解释是流很早以前就已经设计过,即使是std :: string也没有做出决定。 – 2012-04-01 14:15:41