0

これは、継承、テンプレート クラス、および関数ポインタに関する問題です。私はモジュラーツールを開発しています。これは最小限の描写です。

私は可能な限り一般的である必要があるジェネリック基本クラスを持っています (理由はここでは指定されていません):

// base class
class Base {
public:
    virtual void assess( ) = 0;
};

次に、テンプレートとして定義する、より特化した派生クラスがあります。

// derived template class
template <typename T>
class Derived : public Base
{
protected:
    T mValue;
public:
    void assess( );
    T value( ) { return mValue; }
};

// function specialization here
template<>
inline void Derived<int>::assess( )
{
    mValue = 3;
}

assess()上記のように、関数のように一部の部分は特殊化されています。

次に、継承の追加レイヤーがあります。主なアイデアは、引数としてオブジェクトをassess()持つ関数ポインターを含む一般的な関数を持つことです。Base

// class specialization for special evaluation through function pointers
template <typename T>
class DerivedFuncPtr : public Derived<T> {
protected:
    T (*mFuncPtr)( Base& );
    Base *mFuncVar;
public:
    DerivedFuncPtr<T>( T (*f)(Base&), Base& variable )
    {
        mFuncPtr = f;
        mFuncVar = variable;
    }
    void assess( )
    {
        mFuncVar->assess();
        this->mValue = (*mFuncPtr)(*mFuncVar);
    }
};

さて、問題は使い方です。主なソースは次のようになります。

int squared( Derived<int>& );
int squared( Derived<int>& d )
{
    int val = d.value();
    return val*val;
}

int main (int argc, const char * argv[])
{
    Derived<int> object;
    object.assess();
    cout << object.value() << "\n" ;

    DerivedFuncPtr<int> objectFP( squared, object ); // (*)

    return 0;
}

オンラインでのコンパイルでエラーが発生する(*)

Candidate constructor not viable: no known conversion from 'int (Derived<int> &)' to 'int (*)(Base &)' for 1st argument

関数ポインターをテンプレート化されたクラスにカプセル化するU (*)(Base&)必要がありますか、それともここで明らかな何かが欠けていますか?

美学のために、そして私は最近の C++ の進化に慣れていないので、boostライブラリや C++11 を使用したくないのですが、やむを得ない場合は... ありがとうございます。

4

1 に答える 1

0
DerivedFuncPtr<T>( T (*f)(Base&), Base& variable )

Base&コンストラクターの最初の引数は、 を引数として受け取る (そして を返す)関数へのポインターTです。関数ポインターへのそのBase&引数は、squaredを受け取る への引数と一致しませんDerived<int>&

これを修正する 1 つの方法は、DerivedFuncPtr2 つのテンプレート引数を取るクラス テンプレートを作成することtypename Tです。1 つは既に持っているもので、もう1 つはBase、データ メンバーとコンストラクターでの使用を置き換える別の型名です。

ところで、mFuncVar = variable;そのコンストラクターでもエラーが発生します。mFuncVarはポインタ、variable参照です。

于 2012-10-26T04:28:31.220 に答える