Curiously recurring template - variation

c++, crtp, templates

Solution

This should compile as well. We just need to get the other template parameter specified explicitly

 template <typename T, template <typename T> class Derived>
 class Base
 {
 public:
     void CallDerived()
     {
        Derived<T>* pT = static_cast<Derived<T>*> (this);
        pT->Action(); // instantiation invocation error here
     }
 };

template<typename T>
class Derived: public Base<T,Derived>
{
public:
    void Action()
    {
    }
};

Problem

Regarding CRP if I want to implement a slight variation of it (using template template parameter) I get a compile error: ``` template <template <typename T> class Derived> class Base { public: void CallDerived() { Derived* pT = static_cast<Derived*> (this); pT->Action(); // instantiation invocation error here } }; template<typename T> class Derived: public Base<Derived> { public: void Action() { } }; ``` I am not exactly sure one would chose this form (that does not compile for me) instead of using this though (this works) ``` template <typename Derived> class Base { public: void CallDerived() { Derived* pT = static_cast<Derived*> (this); pT->Action(); } }; template<typename T> class Derived: public Base<Derived<T>> { public: void Action() { } }; ```

Original source