наследование typedef из чистой абстрактной базы - PullRequest
8 голосов
/ 04 сентября 2010

Редактировать: Найдено Дубликат

Я сократил некоторый проблемный код до простейшего рабочего случая, чтобы проиллюстрировать следующее: мой 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;

Обратите внимание, что тип system_t уже задан в базовом классе typedef '. Почему я должен включать другой typedef при наследовании?

Я понимаю, что могу определить квалифицированное имя system_t в производном ConcreteTemplateMethod, используя typename TemplateMethod< Analyzer<T> >::system_t&, но это немного многословно, и я бы хотел избежать повторного ввода typedef в базу каждый раз, когда я наследую и должен использовать тот же system_t. Есть ли способ обойти это, что я могу определить в базе TemplateMethod?

1 Ответ

8 голосов
/ 04 сентября 2010

Вы должны сделать

typedef typename TemplateMethod<X>::system_t system_t;

, чтобы "наследовать" typedef.typedef не наследуется автоматически (если компилятор соответствует).

если вы просматриваете переполнение стека, где-то будет дубликат этого вопроса.

...