为何无法从构造函数初始化std::ifstream引用?
这个问题的核心是你误解了C++中引用成员的初始化规则,以及std::ifstream的使用方式,咱们一步步拆解:
为什么会报错?
你的类A中声明了std::ifstream& inFile;——这是一个非const左值引用,引用的本质是已有对象的别名,必须绑定到一个已经存在的std::ifstream对象上,而不是用字符串去"创建"引用。
编译器报错invalid initialization of reference of type ‘std::ifstream&’ from expression of type ‘const string’,直白点说就是:你试图用一个字符串(const std::string类型)去初始化一个输入文件流的引用(std::ifstream&类型),这俩类型完全不匹配,编译器根本不知道怎么把字符串转成std::ifstream的引用。
另外补充一点:就算你写inFile(std::ifstream(file_name))也不行,因为非const左值引用不能绑定到临时对象(std::ifstream(file_name)是临时对象),这也是C++的语法规则。
解决方案1:将成员改为std::ifstream对象(最常用场景)
如果你只是想让类A自己管理一个输入文件流,完全不需要用引用,直接把成员变量改成std::ifstream对象即可。std::ifstream本身有接受const std::string&的构造函数(C++11及以后支持),可以直接用文件名初始化:
#include <string> #include <fstream> class A{ public: A(const std::string& file_name):inFile(file_name){} private: std::ifstream inFile; // 去掉&,改为对象而非引用 }; int main(){ A("text.txt"); }
解决方案2:如果确实需要使用引用(共享外部流场景)
如果你希望类A共享一个外部已经创建好的std::ifstream对象,那构造函数应该接受一个std::ifstream&参数,把成员引用绑定到这个外部对象上:
#include <string> #include <fstream> class A{ public: // 接受外部的输入流引用,绑定到成员 A(std::ifstream& stream):inFile(stream){} private: std::ifstream& inFile; }; int main(){ std::ifstream file("text.txt"); A a(file); // 把外部的file对象传给A的构造函数 }
内容的提问来源于stack exchange,提问作者mato

