typedef继承自纯抽象基类

8

编辑:找到重复的内容。

我已经将一些问题代码简化为最简单的工作示例,以说明以下情况:在纯虚基类中的我的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中定义以解决这个问题?

不,你不能直接这样做。 但是你可以创建一个宏来实现这个功能。 - Anycorn
可能是在C++中的继承和模板-为什么方法不可见?的重复问题。 - David Rodríguez - dribeas
可能是[Propagating 'typedef' from based to derived class for 'template']的重复问题(https://dev59.com/4nI-5IYBdhLWcg3w18Z3)。 - VLL
1个回答

8

你应该做什么:

typedef typename TemplateMethod<X>::system_t system_t;

“继承”typedef。如果编译器符合要求,则typedef不会自动继承。

如果您查看Stack Overflow,可能会在某个地方找到此问题的重复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接