C++,将字符串中的文件名传递给用于ifstream对象的类函数

问题描述:

我是C++新手,不明白为什么我的非常简单的代码不能编译。我想通过从第一个参数传递一个字符串到应用程序来实例化我的类中的ifstream对象。
建设得到:错误:不对应的呼叫 '(的std :: ifstream的)(为const char *)'C++,将字符串中的文件名传递给用于ifstream对象的类函数

页眉:

#ifndef _SIMPLE_TEST 
#define _SIMPLE_TEST 

#include <iostream> 
#include <fstream> 
#include <string.h> 

class mytest { 
public: 
    mytest(int number); 
    bool validate_config(const std::string &s); 
private: 
    std::ifstream configFileStream; 
    int magic; 
}; 

#endif 

代码:

#include <iostream> 
#include <fstream> 
#include <string.h> 
#include "simple.hpp" 


mytest::mytest(int number) { 
    magic = number; 
} 

bool mytest::validate_config(const std::string &s) { 
    configFileStream(s.c_str()); 
    return true; 
} 

int main(int argc, char **argv) { 
    bool check; 
    std::string configFile(argv[1]); 
    mytest DBG(17); 
    check = DBG.validate_config(configFile.c_str()); 
    if (check) { 
     return 0; 
    } 
    return -1; 
} 

构建错误(来自控制台):

Compile src/simple.cpp 
src/simple.cpp: In member function 'bool mytest::validate_config(std::string)': 
src/simple.cpp:12:28: error: no match for call to '(std::ifstream) (const char*)' 
Makefile:23: recipe for target `_out/simple.o' failed 
make: *** [_out/simple.o] Error 1 

我已经搜查,结果一直蜜蜂,它应该工作,因为 我传递的输出字符串类c_str()方法将mytest的validate_config方法(抱歉控制台输出的格式错误)

+0

的['std :: ifstream'](http://en.cppreference.com/w/cpp/io/basic_ifstream)类没有'operator()'函数,你正试图调用它。你是否正在寻找['open'](http://en.cppreference.com/w/cpp/io/basic_ifstream/open)函数? –

您在mytest::validate_config中使用的语法没有达到您的预期。

configFileStream(s.c_str()); 
// tries to call 
// `std::ifstream::operator()(const char*)` 
// which does not exist 

退房ifstream on cppreference核实,有没有电话运营商。


如果你想用一个新的替换现有ifstream情况下,你必须调用它的构造函数:

configFileStream = std::ifstream(s.c_str()); 
// creates a temporary `ifstream` from `s.c_str()` 
// and assigns it to `configFileStream` 

上面的代码行是调用ifstream::ifstream constructor (2)然后ifstream::operator=

从C++ 11开始,仅支持将临时ifstream分配给现有分支。


你想要使用ifstream::open method什么实现的更直接的方式:

configFileStream.open(s.c_str()); 

这种方法不会产生任何临时对象。

+0

@JoachimPileborg:谢谢,改进了答案。 –

+0

谢谢,我很新,很简单。 – IgorLopez

std::ifstream没有一个operator() (...)因为你正试图在这里叫......

bool mytest::validate_config(const std::string &s) { 
    configFileStream(s.c_str()); 
    return true; 
} 

如果你要打开的文件,你可以调用它open(...)

bool mytest::validate_config(const std::string &s) { 
    configFileStream.open(s.c_str()); 
    return true; 
}