Moderno Diseño C++ da el siguiente ejemplo:Uso argumento de clase de plantilla plantilla como parámetro
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_;
};
yo no podía entender cómo se construye ThreadingModel plantilla de una manera que podría aceptar SmartPtr como parámetro, en mi mente alguna recursión loca va a suceder. como puede ser esto posible?
Editar:
He intentado Potatoswatter (lo siento lol) comentario:
template <class SmartPtr> struct SingleThreadingModel
{
class Lock
{
public:
Lock(SmartPtr&)
{
}
};
};
pero DID'NT trabajaban.
aquí es el error que me está dando 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’
Ah, sí. Parámetros de plantilla de plantilla. Una de las cosas más confusas de la historia –
Su nuevo código se ve bien. ¿Qué error obtienes y dónde? Además, un Tomatoswatter suena como si fuera un desastre, y trato de evitarlo. – Potatoswatter