C ++ шаблонная специализация функции: «недопустимое использование явных аргументов шаблона» - PullRequest
20 голосов
/ 13 сентября 2009

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

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 Ответ

52 голосов
/ 13 сентября 2009

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

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

}

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

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

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

};

, поэтому вы должны снова перечислить T1.

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

...