То, что вы на самом деле видите, это то, что у правила единого определения (ODR) есть особый случай для встроенных функций, в котором у каждого TU может быть определение. Если функция, такая как ваша явная специализация int, не является встроенной, вы получите несколько ошибок определения во время ссылки. Такие встроенные функции все еще имеют внешнюю связь. Шаблоны функций: , шаблоны и, следовательно, следуют другим правилам. Учреждения / специализации шаблона функции: функции .
Использование inline, как и для любой функции, является просто подсказкой, но вы можете применить его, если функция короткая (как для любой функции) или если вы просто хотите оставить ее в заголовке. Вот пример без встроенного:
Заголовочный файл:
template<class TYPE>
void some_function(TYPE& val) {
// some generic implementation
}
template<>
void some_function<int>(int& val);
Файл реализации (.cpp):
template<>
void some_function<int>(int& val) {
// some int specific implementation
}