c ++中的继承,范围和模板构造函数

时间:2012-04-04 18:10:16

标签: c++ templates inheritance scope declaration

我有一个简单的问题。我正在编写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了;如果有人有任何想法,那就超级棒!

1 个答案:

答案 0 :(得分:3)

你需要说typename Exec<E>::Exe。因为基类是依赖的。对于Execute,您需要使用前面的基类名称限定呼叫:Exec<E>::Execute();

否则这些非限定名称会忽略依赖基类。