【问题标题】:C++, passing filename in string to class function using it for ifstream objectC ++,将字符串中的文件名传递给类函数,将其用于ifstream对象
【发布时间】:2016-08-13 09:18:25
【问题描述】:

我是 C++ 新手,不明白为什么我的非常简单的代码无法编译。我正在尝试通过将字符串从第一个参数传递给应用程序来在我的类中实例化一个 ifstream 对象。
构建给出:error: no match for call to '(std::ifstream) (const char*)'

标题:

#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 方法(对不起,控制台输出格式错误)

【问题讨论】:

  • std::ifstream 类没有您尝试调用的 operator() 函数。您是否正在寻找 open 函数?

标签: c++ string ifstream member


【解决方案1】:

您在 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());

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

【讨论】:

  • 谢谢,我很容易。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多