Sha*_*ter 8 c++ inheritance design-patterns typedef template-method-pattern
编辑:发现重复
我已经将一些问题代码缩减到最简单的工作案例来说明以下内容:我在纯抽象基类中的typedef不是由派生类继承的.在下面的代码中,我想将system_ttypedef 继承到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;
}
Run Code Online (Sandbox Code Playgroud)
此代码按预期编译和运行.在ConcreteTemplateMethod下面是必需的,当删除时会导致编译器错误:
typedef Analyzer<T> system_t;
Run Code Online (Sandbox Code Playgroud)
但请注意,该system_t类型已typedef在基类中使用.为什么我必须在继承时包含另一个typedef?
我意识到我可以通过使用来限定system_t派生类型中ConcreteTemplateMethod的类型名称typename TemplateMethod< Analyzer<T> >::system_t&,但这有点冗长,并且我希望typedef每次我继承并且需要使用相同时避免重新访问基类system_t.有没有办法解决这个问题,我可以在基地定义TemplateMethod?
你应该做
typedef typename TemplateMethod<X>::system_t system_t;
Run Code Online (Sandbox Code Playgroud)
"继承"typedef.typedef不会自动继承(如果编译符合规).
如果你仔细查看堆栈溢出,那么某个地方会出现这个问题的重复.
| 归档时间: |
|
| 查看次数: |
4965 次 |
| 最近记录: |