2017-09-27 11 views
0

次のように私はboost::property_tree::ptree_bad_data由来私のカスタム例外クラスを持っている:「後押し:: property_tree :: ptree_bad_data :: ptree_bad_data(への呼び出しに該当する機能)

class MyCustomException : public boost::property_tree::ptree_bad_data 
{ 
    public: 
     explicit MyCustomException(const std::string& msg): mMsg(msg) {} 
     virtual ~MyCustomException() throw() {} 
     virtual const char* what() const throw() { return mMsg.c_str(); } 

    private: 
     std::string mMsg; 
}; 

コンパイル時には、私のようにエラーが出:

error: no matching function for call to ‘boost::property_tree::ptree_bad_data::ptree_bad_data()’ explicit MyCustomException(const std::string& msg): mMsg(msg) {} ^ note: candidate expects 2 arguments, 0 provided explicit MyCustomException(const std::string& msg): mMsg(msg) {} ^

どのような理由が考えられますか?

+1

表示されるコードとエラーメッセージが一致しません。ビルドエラーに関する質問を投稿するときは、私たちが表示する[最小、完全、および検証可能なサンプル](http://stackoverflow.com/help/mcve)のエラーを使用してください。 –

+0

@Someprogrammerdudeエラーを編集しました。 – astre

+2

ptree_bad_dataにはデフォルトのctorがないため、エラーです。お元気です。 –

答えて

2

ドキュメントによれば、クラスptree_bad_dataには、パラメータのないコンストラクタはありません。これは、実際には単一のコンストラクタを持っています

template<typename T> ptree_bad_data(const std::string &, const T &); 

だから、あなたは、コンストラクタでこれらの二つの引数を提供する必要があります。

explicit MyCustomException(const std::string& msg) 
    : boost::property_tree::ptree_bad_data(msg, nullptr /* correct data here */) 

あなたの例外クラスが別に例外メッセージを格納するために必要でもありません。標準的な例外クラスがそれを行います。

Btw、ptree_bad_dataからあなたの例外を派生させてもよろしいですか?

+0

ありがとう。出来た。その理由は、std :: exceptionではなく、より具体的な例外を使用するためです。これは良い考えではないかもしれない何か特別な理由? – astre

+1

@astreは、 'ptree_bad_data'から派生する具体的な理由がない場合はstd :: exceptionから派生します(コンストラクタのすべてのパラメータを使用していない場合はおそらくありません)。 – vasek

関連する問題