Ich habe eine kurze Frage. Ich schreibe C++ - Code; Ich habe zwei Klassen in der gleichen Datei. Die eine erbt von der anderen, und ich versuche, Vorlagen zu verwenden, um die Klassen allgemeiner zu machen. HierVererbung, Bereich und Vorlage Konstruktoren in C++
ist die Datei für die Basisklasse:
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
};
Und hier ist die geerbte Klasse:
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();
}
}
};
Allerdings, wenn ich dies versuchen, erhalte ich die folgenden Fehler:
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
Es scheint, dass die Exec (dh die Basis) -Klasse nicht ordnungsgemäß deklariert wird; Wenn ich typedef und die Instanzvariablen aus der Basisklasse in die geerbte Klasse einbeziehe, erhalte ich diese Fehler nicht. Wenn ich jedoch alles aus der Basisklasse einschließe, ist es sinnlos, die Vererbung zu verwenden!
Ich habe versucht, eine "Deklaration" der Basisklasse, wie einige empfohlen haben (dh: Klasse Base;), aber das scheint nicht zu helfen.
Ich habe einige google-fu für einige Stunden gemacht; Wenn jemand Ideen hat, wäre das super!
'Typenname CondExec :: Exe',' this-> ThisObj' und 'this-> Execute()'. –