Специализация функции шаблона c++: "незаконное использование явных аргументов шаблона"

следующий код специализации шаблона:

template<typename T1, typename T2>
void spec1()
{

}

тестовый пример 1:

template< typename T1> //compile error
void spec1<int>()
{

}

тестовый пример 2:

template< typename T2> //compile error
void spec1<int>()
{

}

генерирует следующую ошибку компиляции:

ошибка C2768: 'spec1': незаконное использование явных аргументов шаблона

кто-нибудь знает почему?

1 ответов


шаблоны функций не могут быть частично специализированных, полностью, т. е. так:

template<>
void spec1<char, int>()
{

}

Почему шаблоны функций не могут быть частично специализированы, вы можете захотеть читать это.

когда вы специализируетесь частично (возможно только для классов), вам придется сделать это так:

template <typename T1>
class class1<T1, int>
{

};

так что вы должны перечислить T1 снова.

то, как написаны ваши специализации, они были бы неоднозначными для spec1<int, int>.