2016-08-13 11 views
0

Я новичок в C++ и не понимаю, почему мой очень простой код не компилируется. Я пытаюсь создать экземпляр объекта ifstream в моем классе, передав строку из первого аргумента в приложение.
здание не дает: ошибка: не подходит для вызова '(станд :: ifstream) (Const символ *)'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)? –

ответ

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=.

Назначение временного ifstream существующего поддерживается только с C++ 11.


Более простой способ достижения того, что вы хотите использует ifstream::open method:

configFileStream.open(s.c_str()); 

Этот подход не создает временный объект.

+0

@JoachimPileborg: спасибо, улучшил ответ. –

+0

Спасибо, я новый, это было легко. – IgorLopez

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