8

编辑:发现重复

我已经将一些问题代码缩减为最简单的工作案例来说明以下内容:我在纯抽象基类中的 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;
}

此代码按预期编译和运行。以下ConcreteTemplateMethod是必需的,当删除时会导致编译器错误:

typedef Analyzer<T> system_t;

但是请注意,该system_t类型已经typedef在基类中。为什么在继承时必须包含另一个 typedef?

我意识到我可以通过 using限定system_t派生中的类型名,但这有点冗长,我想避免每次继承并需要使用相同的 . 有没有办法可以在基础中定义?ConcreteTemplateMethodtypename TemplateMethod< Analyzer<T> >::system_t&typedefsystem_tTemplateMethod

4

1 回答 1

8

你应该做

typedef typename TemplateMethod<X>::system_t system_t;

“继承” typedef。typedef 不会自动继承(如果编译器兼容)。

如果您查看堆栈溢出,则会在某处重复此问题。

于 2010-09-03T20:24:28.910 回答