0

簡単な質問があります。私は C++ コードを書いています。同じファイルに 2 つのクラスがあります。一方は他方を継承しており、テンプレートを使用してクラスをより一般的にしようとしています。

基本クラスのファイルは次のとおりです。

template<class E> // this is the class we will execute upon
class Exec{

protected: 

    typedef void (*Exe)(E*); // define a function pointer which acts on our template class.

    Exe* ThisFunc; // the instance of a pointer function to act on the object
    E* ThisObj;    // the object upon which our pointer function will act

public:

    Exec(Exe* func, E* toAct){ThisFunc = func; ThisObj=toAct;} 
    Exec(){;} // empty constructor

void Execute(){ThisFunc(ThisObj);} // here, we pass our object to the function

};

そして、継承されたクラスは次のとおりです。

template<class E> // this is the class we will execute upon
class CondExec : protected Exec<E>{ // need the template!

protected:

    typedef bool (*Cond)(E*); // a function returning a bool, taking a template class
    Cond* ThisCondition;

public:

CondExec(Exe* func, E* toAct,Cond* condition): Exec<E>(func,toAct){ThisCondition=condition;}

void ExecuteConditionally(){
    if (ThisCondition(ThisObj)){
        Execute();
        }
    }
};

ただし、これを試すと、次のエラーが表示されます。

executables.cpp:35: error: expected `)' before ‘*’ token
executables.cpp: In member function ‘void CondExec<E>::ExecuteConditionally()’:
executables.cpp:37: error: ‘ThisObj’ was not declared in this scope
executables.cpp:37: error: there are no arguments to ‘Execute’ that depend on a template             parameter, so a declaration of ‘Execute’ must be available

Exec (つまり、基本) クラスが適切に宣言されていないようです。継承されたクラスに基本クラスの typedef とインスタンス変数を含めると、これらのエラーは発生しません。ただし、基本クラスからすべてを含めると、継承を使用しても意味がありません!

一部の人が推奨しているように(つまり、class Base;)、基本クラスの「宣言」を試みましたが、それは役に立たないようです。

私はこれについて数時間グーグルフーを行ってきました。誰かに何かアイデアがあれば、それは素晴らしいことです!

4

1 に答える 1

3

あなたは言う必要がありますtypename Exec<E>::Exe。ベースクラスが依存しているためです。Execute の場合と同様に、ベースクラス名を前に付けて呼び出しを修飾する必要があります: Exec<E>::Execute();

それ以外の場合、これらの非修飾名は依存する基本クラスを無視します。

于 2012-04-04T18:13:51.243 に答える