سؤال

تحرير: وجدت مكرر

لقد قمت بتخفيض بعض رمز المشكلات إلى أبسط حالة عمل لتوضيح ما يلي: لا يتم توريث 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'ed في الفئة الأساسية ، ولكن. لماذا يجب علي تضمين typedef آخر عند الوراثة؟

أدرك أنه يمكنني تأهيل اسم Typename of system_t في المشتق ConcreteTemplateMethod باستخدام typename TemplateMethod< Analyzer<T> >::system_t&, ، لكن هذا مطول بعض الشيء ، وأود تجنب الاضطرار إلى إعادةtypedef إلى القاعدة في كل مرة أرث فيها وأحتاج إلى استخدام ذلك system_t. هل هناك طريقة للتغلب على هذا يمكنني تحديدها في القاعدة TemplateMethod?

هل كانت مفيدة؟

المحلول

يجب أن تفعل

typedef typename TemplateMethod<X>::system_t system_t;

إلى "ورث" typedef. Typedef غير موروثة تلقائيًا (إذا كان التحويل البرمجي متوافقًا).

إذا نظرت من خلال فائض المكدس ، فسيكون هناك تكرار من هذا السؤال في مكان ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top