编辑:找到重复的内容。
我已经将一些问题代码简化为最简单的工作示例,以说明以下情况:在纯虚基类中的我的typedef没有被派生类继承。在下面的代码中,我希望将system_t
typedef继承到ConcreteTemplateMethod
中:
#include <iostream>
// pure abstract template-method
template <typename T> // T == Analyzer<U>
class TemplateMethod {
public:
typedef T system_t;
virtual void fn (const system_t& t) const = 0;
};
template <typename T>
class Analyzer {
public:
void TemplatedAlgorithm (const TemplateMethod< Analyzer <T> >& a) const {
printf ("Analyzer::TemplatedAlgorithm\n");
a.fn(*this); // run the template-method
}
void fn () const {
printf ("Analyzer::fn\n");
}
};
// concrete template-method
template <typename T>
class ConcreteTemplateMethod : public TemplateMethod < Analyzer<T> > {
public:
typedef Analyzer<T> system_t;
virtual void fn (const system_t& t) const {
printf ("ConcreteTemplateMethod::fn\n");
t.fn(); // perform Analyzer's fn
}
};
int main () {
Analyzer <double> a;
ConcreteTemplateMethod<double> dtm;
a.TemplatedAlgorithm(dtm);
return 0;
}
这段代码编译并按预期运行。在ConcreteTemplateMethod
中需要以下内容,如果删除会导致编译器错误:
typedef Analyzer<T> system_t;
请注意,在基类中已经使用
typedef
定义了system_t
类型。然而,当我继承时,为什么我必须包含另一个typedef
?我意识到,在派生的
ConcreteTemplateMethod
中,我可以使用typename TemplateMethod< Analyzer<T> >::system_t&
来限定system_t
的类型名称,但这有些冗长,我想避免每次继承并需要使用相同的system_t
时都要重新在基类中进行typedef
。是否有一种方法可以在基类TemplateMethod
中定义以解决这个问题?