Utilizar CRTP (Modelo Curiosamente Recorrente de Modelo) com parâmetros de tipo adicionais
Tento usar o CRTP (Curiously Recurring Template Pattern) e forneço parâmetros de tipo adicionais:
template <typename Subclass, typename Int, typename Float>
class Base {
Int *i;
Float *f;
};
...
class A : public Base<A, double, int> {
};
Este é provavelmente um erro, a superclasse mais apropriada seriaBase<A, double, int>
- embora esse argumento de incompatibilidade de ordem não seja tão óbvio. Esse bug seria mais fácil de ver se eu poderia usar o nome do significado dos parâmetros em um typedef:
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;
};
No entanto, isso não compila no gcc 4.4, os erros relatados são dados como comentários acima - acho que o motivo é que, antes de criar A, ele precisa instanciar o modelo Base, mas isso, por sua vez, precisa saber A.
Existe uma boa maneira de passar parâmetros de modelo "nomeados" enquanto estiver usando o CRT