Вы не можете сделать это, кроме как путем написания специализации для всех T*
, кроме случаев, когда T
равно void
.В противном случае вы извлечете класс из себя, который по понятным причинам не может работать.
Создание шаблона первичного класса для аргументов, имеющих явную или частичную специализацию, невозможно.Если вы попытаетесь, провоцируя создание экземпляра до того, как явная или частичная специализация станет видимой (обратите внимание, что ваш код не вызывал такое создание), ваша программа будет плохо сформирована, без необходимости диагностики (что фактически делает поведение неопределенным).
Для достижения вышеупомянутого решения можно использовать SFINAE
template <class T>
struct isnt_void { typedef void type; };
template<> struct isnt_void<void> { };
template <class T, class = void>
class Foo {};
template <class T>
class Foo<T*, typename isnt_void<T>::type> : public Foo<void*> {};
.