ميراث typedef من قاعدة مجردة خالصة
-
30-09-2019 - |
سؤال
تحرير: وجدت مكرر
لقد قمت بتخفيض بعض رمز المشكلات إلى أبسط حالة عمل لتوضيح ما يلي: لا يتم توريث 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 غير موروثة تلقائيًا (إذا كان التحويل البرمجي متوافقًا).
إذا نظرت من خلال فائض المكدس ، فسيكون هناك تكرار من هذا السؤال في مكان ما.