Забудьте о наследовании, которое не имеет никакого отношения к рассматриваемой проблеме.
Частичная специализация означает, что вы создаете новый шаблон из существующего, который является более специализированным, но все же общим, путем сопоставления с более узким шаблоном. Общая схема вашего примера выглядит следующим образом:
template <typename T> class Foo; // primary template
template <typename U> class Foo<U*>; // partial specialization
template <> class Foo<fool>; // full specialization
Первая строка является основным шаблоном и соответствует всему , который не соответствует более специализированной форме. Третья строка определяет фактический тип (не шаблон!) Foo<fool>
(для некоторого данного типа fool
). Средняя линия, с другой стороны, все еще является шаблоном, но она соответствует только типу формы T = U *
, то есть указателю:
Foo<char> x; // uses primary template with T = char
Foo<fool> y; // uses full specialization (nothing to be matched)
Foo<int*> z; // uses partial specialization, matching U = int
О Vector<void*>
: просто получается, что автор решил определить частично специализированный Vector<U*>
как производный от фиксированного класса Vector<void*>
(который должен был бы быть полностью специализированным в другом месте).