Use o argumento de classe do modelo como parâmetro

O design moderno do C ++ fornece o seguinte exemplo:

template <class T> struct EnsureNotNull
{
    static void Check(T*& ptr)
    {
      if (!ptr) ptr = GetDefaultValue();
    }
};

template
<
   class T,
   template <class> class CheckingPolicy = EnsureNotNull,
   template <class> class ThreadingModel
>
class SmartPtr
  : public CheckingPolicy<T>
  , public ThreadingModel<SmartPtr>
{
...
  T* operator->()
  {
    typename ThreadingModel<SmartPtr>::Lock guard(*this);
    CheckingPolicy<T>::Check(pointee_);
    return pointee_;
  }
private:
  T* pointee_;
};

Eu não conseguia imaginar como o modelo ThreadingModel seria construído de uma maneira que pudesse aceitar o SmartPtr como parâmetro. Na minha opinião, alguma recursão maluca acontecerá. Como isso pode ser possível?

Editar:

Eu tentei Potatoswatter (desculpe lol) comentário:

template <class SmartPtr> struct SingleThreadingModel
{
  class Lock
  {
    public: 
      Lock(SmartPtr&)
      {
      }
  };
};

mas não funcionou.

aqui está o erro que o gcc está me dando:

main.cpp:28:35: error: type/value mismatch at argument 1 in template parameter list for ‘template<class> class ThreadingModel’
main.cpp:28:35: error:   expected a type, got ‘SmartPtr’

questionAnswers(1)

yourAnswerToTheQuestion