編集:重複が見つかりました
以下を説明するために、いくつかの問題コードを最も単純な動作ケースに絞り込みました: 純粋な抽象基本クラスの 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 を含める必要があるのはなぜですか?
を使用system_t
して派生の型名を修飾できることはわかっていますが、それは少し冗長であり、継承して同じ を使用する必要があるたびにベースに戻す必要がないようにしたいと考えています。base で定義できるこれを回避する方法はありますか?ConcreteTemplateMethod
typename TemplateMethod< Analyzer<T> >::system_t&
typedef
system_t
TemplateMethod