На самом деле нет никакой разницы между явно специализированной функцией шаблона и обычной не шаблонной функцией, за исключением того факта, что когда компилятор ищет соответствующий тип подписи для вызова функции, он сначала выберет не шаблонный функция, которая сопоставляет требуемую подпись, прежде чем пытаться создать экземпляр любых доступных функций шаблона, которые могут выполнить требуемое совпадение подписи.
Если вы собираетесь объявить и определить функцию внутри файла заголовка, который является , а не шаблоном-функцией, вы должны будете объявить функцию как inline
. Это связано с тем, что функция шаблона не является реальной функцией, которая связана с модулем кода до тех пор, пока она не будет реализована. Затем компоновщик отбрасывает это создание после компиляции модуля кода. Если компоновщик не сделал этого, то каждый раз, когда файл .cpp включал заголовочный файл, компоновщик жаловался бы на дубликаты определений для функции. Использование ключевого слова inline
в функции, не связанной с шаблоном, имеет аналогичный эффект на уровне компилятора, поскольку всякий раз, когда функция используется в файле .cpp, компилятор заменяет этот вызов функции телом кода функции из inline
функция в заголовочном файле и позволяет избежать накладных расходов при вызове функции с помощью связанной и активной настройки и очистки записи стека. Поэтому компоновщик не будет жаловаться на дубликаты определений для функции.