You have to use a wrapper class (here it's value_getter
) which is declared before you define Base
. You can then specialize it right before you defined Derived
:
template<typename T>
struct value_getter;
template<typename Type, template<typename> class Crtp>
class Base
{
public:
typedef int value;
value f1() {return 4.2;}
// in 'class Derived<double>'
typename value_getter<Crtp<Type> >::value f2() {return 4.2;}
};
template<typename Type>
class Derived;
template<typename Type>
struct value_getter<Derived<Type> > {
typedef Type value;
};
template<typename Type>
class Derived : public Base<Type, Derived>, public value_getter<Derived<Type> >
{
public:
};
It's not exactly pretty, but at least it works.