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

时间:2016-08-13 09:18:26

标签: c++ string ifstream member

我是C ++新手,不明白为什么我的非常简单的代码无法编译。我试图通过从第一个参数传递一个字符串到应用程序来实例化我的类中的ifstream对象 建筑物给出:错误:不匹配调用'(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方法(抱歉控制台输出格式不正确)

1 个答案:

答案 0 :(得分:3)

您在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分配给现有的临时configFileStream.open(s.c_str());

实现目标的更简单方法是使用ifstream::open method

import React, {PropTypes} from 'react';
import NameForm from './NameForm.react';
import Faker from 'Faker'

export default class NamesList extends React.Component {
  constructor(){
    super();
    this.addItem = this.addItem.bind(this);
  }

  addItem(){
    var randomName = Faker.name.findName();
    this.props.addName(randomName);
  }

  render() {
    let forms = this.props.names.map((name,i) => {
      return <NameForm updateName={this.props.updateName} index={i} key={i} name={name} />
    });
    return (<div>
      <div>{forms}</div>
      <button onClick={this.addItem}>Add</button>
    </div>);
  }
}

NamesList.propTypes = {
  names: PropTypes.arrayOf(PropTypes.string).isRequired
};

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