template <typename T>
void A<T, char>::Print() {} // Will produce error
Вы:
- переопределяете функцию (она уже была определена при объявлении
void Print() {}
, вы видите {}
. - ссписок аргументов шаблона, который не соответствует объявлению:
template <typename T, typename U> void Print()
Фактически, даже если вы не определили функцию при ее объявлении, вы все равно будете иметь ошибку, так как ваше объявление иопределение не совпадает, компилятор не сможет найти определение для исходного шаблона или объявление для специализированного шаблона.
Функция специализированного шаблона для функции, связанной со структурой, должна иметьЭтот код работает также:
template <typename T, typename U>
struct A {
void Print() {}
};
template <>
void A<int, float>::Print() {} // Okay
template <typename T>
struct A<T,char>
{
void Print();
};
template <typename T>
void A<T,char>::Print() {}
Поскольку функция шаблона была объявлена в ее структуре шаблона.