純粋な抽象的なベースからの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
しかし、基本クラスでエド。継承するときに別のtypedefを含める必要があるのはなぜですか?
私はのタイプ名を資格を得ることができることを理解しています system_t
派生した ConcreteTemplateMethod
使用して typename TemplateMethod< Analyzer<T> >::system_t&
, 、しかし、それは少し冗長です、そして私は再び避けなければならないことを望んでいますtypedef
私が相続するたびにベースに、それを同じ使用する必要があります system_t
. 。私がベースで定義できるこれを回避する方法はありますか TemplateMethod
?
解決
やったほうがいい
typedef typename TemplateMethod<X>::system_t system_t;
typedefを「継承」します。 typedefは自動的に継承されません(コンパイラが準拠している場合)。
スタックオーバーフローを通して見ると、この質問がどこかに複製されます。
所属していません StackOverflow