You cannot ever refer to a template partial specialisation. You have to refer to the template, and if it matches the partial specialisation, the partial specialisation will be used.
After
template <typename T>
struct S;
template<>
struct S<int> { };
you wouldn't expect to be able to refer to S<>
(without specifying int
), would you?
After
template <typename T>
struct S;
template <typename T>
struct S<T *> { };
you would expect S<int *>
to match the partial specialisation with T = int
, not with T = int *
, right?
There is no difference here. If a template has three parameters, you need three arguments to be able to use the template.