C++之 fstream open函数( error: no matching function for call to ‘std::basic_ifstream::open(const)

C++使用fstream进行文件读写,非常的方便,但是在日常使用的时候,常常会忽视掉一些小问题,如下:

环境:

       Ubuntu16.04

      g++: 5.4.0

C++之 fstream open函数( error: no matching function for call to ‘std::basic_ifstream::open(const)_第1张图片

例如以上代码,在编写时可能察觉不到问题的所在,但编译时就会报如下错:

C++之 fstream open函数( error: no matching function for call to ‘std::basic_ifstream::open(const)_第2张图片

但是原因何在呢?

因为我们这样写是没问题的:

那么首先来看下ifstream 的open成员函数官方文档是如何介绍的。

C++之 fstream open函数( error: no matching function for call to ‘std::basic_ifstream::open(const)_第3张图片

以上可以看到,fstream::open有两种重载方式

1:open( const char* filename, ios_base::openmode mode=ios_base::in | ios_base::out);(可以看出 这种写法明显是为了兼容C的写法。);

2:  open( const string& filename, ios_base::openmode = ios_base::in | ios_base::out);

可以看到open函数是打开由参数filename标识的文件,将其与流对象相关联,以便对其内容执行输入/输出操作。参数mode指定文件打开的模式。

然后再来看下open函数的参数:

C++之 fstream open函数( error: no matching function for call to ‘std::basic_ifstream::open(const)_第4张图片

可以看到,上面出问题的地方就在于filename;即filename是要打开的文件名的字符串。 其格式和有效性的细节取决于库的实现和运行环境。

通过上述文档并没有明确找到以上问题的原因。但有说到其格式和有效性的细节取决于库的实现和运行环境。那么在windows(Dev C++)上是否有这类问题呢?

C++之 fstream open函数( error: no matching function for call to ‘std::basic_ifstream::open(const)_第5张图片C++之 fstream open函数( error: no matching function for call to ‘std::basic_ifstream::open(const)_第6张图片

可以发现,同样的写法在windows下是没有问题的,那么linux为什么会出问题呢?

在linux forums找到这句话C++ ofstream::open won't accept string as a filename

因此  根据以上可以推知,linux下会出问题原因就在于string不能直接作为fstream的参数直接传入。

所以 更改如下:

C++之 fstream open函数( error: no matching function for call to ‘std::basic_ifstream::open(const)_第7张图片

即可顺利通过编译了。

 

你可能感兴趣的:(C++,STL)