Использовать шаблонный аргумент класса шаблона в качестве параметра

Современный C ++ Design приводит следующий пример:

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_;
};

Я не мог понять, как шаблон ThreadingModel будет построен таким образом, чтобы он мог принимать SmartPtr в качестве параметра, на мой взгляд, может произойти какая-то безумная рекурсия. Как это может быть возможным?

Редактировать:

Я пробовал Potatoswatter (извините, смеется) комментарий:

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

но это не сработало.

вот ошибка, которую дает мне gcc:

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’

Ответы на вопрос(1)

Ваш ответ на вопрос