1

すべての派生クラスのインターフェイスを定義する基本クラスを作成しようとしています。

そのクラスの構成ファイルを読み取ることができる機能が必要ですboost::property_tree. この関数を と呼びましょうreadConfig。これは各派生クラスで定義する必要があるため、純粋仮想にしました。

readConfig基本クラスのオーバーロードされたすべての関数が最終的に純粋な仮想フォームを呼び出す基本クラスの関数をオーバーロードしたいと思います。

class Base
{
    // ...
    void readConfig(string, string);                                 // read config from file
    virtual void readConfig(boost::property_tree::ptree, string) =0; // read config from ptree
}

void Base::readConfig(string filename, string entry)
{
     boost::property_tree::ptree pt;
     read_xml(filename, pt);
     readConfig(pt, entry);       // <= Calling pure virtual function!
}

基本的に、文字列バージョンは、純粋な仮想フォームのクイック ラッパーです。これをコンパイルすると、エラーが発生します。

no known conversion for argument 1 from std::string to boost::property_tree::ptree`

そのため、非仮想関数 (からBase) が使用可能であると認識されていないようです。派生クラスの定義が問題ないことを確認しました。

class Deriv : public Base
{
    // ...
    void readConfig(boost::property_tree::ptree, string); // implement virtual, error is on this line
}

void Deriv::readConfig( boost::property_tree::ptree pt, string entry)
{
    //...
}

constコードをもう少し読みやすくするために、多くの-correctnes、参照渡しなどを省略したことに注意してください。

これを修正するにはどうすればよいですか? 非仮想関数で純粋な仮想メンバー関数を使用することは良い考えですか?

4

2 に答える 2

2

明らかなタイプミスは明らかです:

virtual void readConfug

それ以外の

virtual void readConfig

また、実装しているのはテンプレートメソッドパターン、FYIと呼ばれます。

于 2012-05-05T19:12:25.533 に答える