2009-09-12 3 views
20

Следующий код шаблона специализации: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>() 
{ 

} 

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

error C2768: 'spec1' : illegal use of explicit template arguments

Кто-нибудь знает почему? Шаблоны

+0

какая платформа/компилятор вы используете? – aaa90210

+0

Я использую Visual C++ 08 – jameszhao00

ответ

51

Функция не может быть частично специализированы, только в полном объеме, то есть как то:

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

} 

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

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

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

}; 

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

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

+3

Итак, у меня есть частично специализированные классы, встроенные со статическими функциями? – jameszhao00

+0

О, я вижу, что статья, на которую вы ссылаетесь, уже объясняет вопросы. Я удалил свой ответ, так как обнаружил, что пересылка в класс более удобна для этого случая. В случаях, когда «T1» и «T2» используются как типы параметров функции, я нахожу перегрузку гораздо более удобочитаемой, так как она точно так же, как и при нормальной перегрузке функций. –

+0

Когда я прочитал «только для занятий», я отказался. Я обнаружил, что это возможно для классов и структур ;-). –

Смежные вопросы