Шаблоны функций не могут быть частично специализированными, только полностью, например:
template<>
void spec1<char, int>()
{
}
Почему шаблоны функций не могут быть частично специализированными, вы можете прочитать это .
Когда вы специализируетесь частично (возможно только для классов), вам придется делать это так:
template <typename T1>
class class1<T1, int>
{
};
, поэтому вы должны снова перечислить T1
.
То, как пишутся ваши специализации, было бы неоднозначным для spec1<int, int>
.