Похоже, вам нужен шаблон шаблона:
template < template<typename T> class PointerClass, typename T>
PointerClass<T>* pointer_factory(void* ptr, T dummy_type)
вместо
template <class PointerClass, typename T>
PointerClass<T>* pointer_factory(void* ptr, T dummy_type)
, поскольку PointerClass
сам является шаблоном.
Это исправляет ошибку компиляции, вам придется проверить, выполняет ли она то, что вам нужно, хотя я сомневаюсь, что так и будет.
EDIT:
Похоже, что фабричный класс, а не шаблоны, в этом случае может быть проще для написания и понимания другими.