我有一个简单的问题。我正在编写C ++代码;我在同一个文件中有两个类。一个继承自另一个,我试图使用模板使类更通用。
以下是基类的文件:
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(即:base)类未正确声明;如果我在继承的类中包含typedef和基类的实例变量,我不会得到这些错误。但是,如果我包含基类中的所有内容,那么使用继承毫无意义!
我已尝试对基类进行“声明”,正如一些人所推荐的那样(即:类Base;),但这似乎没有帮助。
我已经做了几个小时的google-fu了;如果有人有任何想法,那就超级棒!
答案 0 :(得分:3)
你需要说typename Exec<E>::Exe
。因为基类是依赖的。对于Execute,您需要使用前面的基类名称限定呼叫:Exec<E>::Execute();
。
否则这些非限定名称会忽略依赖基类。