2016-08-13 2 views
0

私はC++初心者です。私の非常に単純なコードがコンパイルされない理由を理解できません。私は最初の引数からアプリケーションに文字列を渡すことによってクラス内のifstreamオブジェクトをインスタンス化しようとしています。
ビルが与える:エラー: '(STD ::はifstream)(定数の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 

私は検索しましたし、結果は常に

+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メソッドに文字列クラスのc_str()メソッドからの出力を渡しています ので、動作するべきであるとハチました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は、ファイルを開きたい場合は、あなたがそれにopen(...)を呼び出すことができます...

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

operator() (...)を持っていません。

bool mytest::validate_config(const std::string &s) { 
    configFileStream.open(s.c_str()); 
    return true; 
} 
関連する問題