C++ 从纯抽象基继承typedef

C++ 从纯抽象基继承typedef,c++,design-patterns,inheritance,typedef,template-method-pattern,C++,Design Patterns,Inheritance,Typedef,Template Method Pattern,编辑:找到 我将一些问题代码缩减为最简单的工作案例,以说明以下内容:我的纯抽象基类中的typedef没有被派生类继承。在下面的代码中,我想将系统\u ttypedef继承到ConcreteTemplateMethod: #include <iostream> // pure abstract template-method template <typename T> // T == Analyzer<U> class TemplateMethod {

编辑:找到

我将一些问题代码缩减为最简单的工作案例,以说明以下内容:我的纯抽象基类中的typedef没有被派生类继承。在下面的代码中,我想将
系统\u 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;
}
但是,请注意,
system\u t
类型已经在基类中定义了
typedef
。为什么在继承时必须包含另一个typedef

我意识到我可以通过使用
typename TemplateMethod::system\u t&
在派生的
ConcreteTemplateMethod
中限定
system\u t
的类型名,但这有点冗长,我希望避免每次继承并需要使用相同的
系统时都必须将typedef
重新添加到基。是否有一种方法可以在base
TemplateMethod
中定义?

您应该这样做

typedef typename TemplateMethod<X>::system_t system_t;
typedef typename TemplateMethod::system\u t system\t;
“继承”typedef。typedef不会自动继承(如果编译器兼容)


如果您查看堆栈溢出,就会发现这个问题在某个地方重复。

不,您不能直接这样做。但是,您可以编写一个宏来执行此操作。的可能重复
typedef typename TemplateMethod<X>::system_t system_t;