Ответ 1
Согласно пункту 3.2: 4 в стандарте С++
Каждая программа должна содержать ровно одно определение каждого нестрочного функция или переменная, которая используется в этой программе odr; нет диагностических обязательный. Определение может отображаться явно в программе, оно может можно найти в стандартной или пользовательской библиотеке или (когда соответствующий) он неявно определен (см. 12.1, 12.4 и 12,8). Встроенная функция должна быть определена в каждой единицы перевода, в которой она используется odr.
Это объясняет, почему возникает ошибка времени соединения, когда специализированная функция не объявлена встроенной. Программа будет содержать несколько определений специализированной функции, по одному от каждого модуля, включая .tpp файл, и это нарушает условие из стандарта. При объявлении специализированной функции inline
она заставит функцию удовлетворять второй части того же предложения, т.е. Что встроенная функция должна быть определена в каждом модуле с использованием функции.
Если параметризованная функция не специализирована, она подпадает под действие пункта 3.2: 6:
Может быть более одного определения типа класса (раздел 9), тип перечисления (7.2), встроенная функция с внешней связью (7.1.2), шаблон класса (раздел 14), шаблон нестатической функции (14.5.6), статический элемент данных шаблона класса (14.5.1.3), функция-член шаблон класса (14.5.1.1) или специализированную специализацию, для которой некоторые параметры шаблона не указаны (14.7, 14.5.5) в программе при условии, что каждое определение появляется в другой единицы перевода
В этом разделе указывается, что для многих определений одной и той же функции шаблона все в порядке, если хотя бы один из параметров шаблона не указан в коде. Это должно позволить принять решение о том, должна ли параметризованная функция создаваться в модуле только для локальной информации.