Curiously Recurring Template Pattern (CRTP) を使用して、追加の型パラメーターを提供しようとしています。
template <typename Subclass, typename Int, typename Float>
class Base {
Int *i;
Float *f;
};
...
class A : public Base<A, double, int> {
};
これはおそらくバグであり、より適切なスーパークラスがありますBase<A, double, int>
-- ただし、この引数の順序の不一致はそれほど明白ではありません。このバグは、typedef 内のパラメーターの意味に name を使用できれば、簡単に確認できます。
template <typename Subclass>
class Base {
typename Subclass::Int_t *i; // error: invalid use of incomplete type ‘class A’
typename Subclass::Float_t *f;
};
class A : public Base<A> {
typedef double Int_t; // error: forward declaration of ‘class A’
typedef int Double_t;
};
ただし、これは gcc 4.4 ではコンパイルされません。報告されたエラーは上記のコメントとして示されています。その理由は、A を作成する前に Base テンプレートをインスタンス化する必要があるためだと思いますが、これには A を知る必要があります。
CRTP の使用中に「名前付き」テンプレート パラメータを渡す良い方法はありますか?