Ответ 1
Вот комментарии к каждому синтаксису:
void foo(int param); //not a specialization, it is an overload
void foo<int>(int param); //ill-formed
//this form always works
template <> void foo<int>(int param); //explicit specialization
//same as above, but works only if template argument deduction is possible!
template <> void foo(int param); //explicit specialization
//same as above, but works only if template argument deduction is possible!
template void foo(int param); //explicit instantiation
Добавил (а) меня:
//Notice <int>. This form always works!
template void foo<int>(int param); //explicit instantiation
//Notice <>. works only if template argument deduction is possible!
template void foo<>(int param); //explicit instantiation
С точки зрения кодирования, перегрузка предпочтительнее специализации-шаблона-специализации.
Итак, не специализируйте шаблон функции:
И знать терминологию:
- конкретизации
- Явная реализация
- специализация
- Явная специализация
Смотрите это: