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