C++,将字符串中的文件名传递给 class 函数,将其用于 ifstream object

C++, passing filename in string to class function using it for ifstream object

我是 C++ 新手,不明白为什么我的非常简单的代码无法编译。我正在尝试通过将来自第一个参数的字符串传递给应用程序来在我的 class 中实例化一个 ifstream object。
构建给出:错误:不匹配调用'(std::ifstream) (const char*)'

Header:

#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

我已经搜索过,结果一直是它应该可以工作,因为 我将字符串 class c_str() 方法的输出传递给 mytest validate_config 方法(抱歉控制台输出格式错误)

您在 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) and then ifstream::operator=.

仅自 C++11 起支持将临时 ifstream 分配给现有的。


一个更直接的方法来实现你想要的是使用 ifstream::open method:

configFileStream.open(s.c_str());

此方法不会创建任何临时对象。

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;
}