Да, вам нужен спецификатор inline
.
ODR (правило одного определения) гласит, что должно быть ровно одно определение переменной, функции, класса, перечисления или шаблона. Исключения, относящиеся к вашему вопросу, перечислены в §3.2/5 (С++ 11) (выделено мной):
Может быть более одного определения типа класса (раздел 9), типа перечисления (7.2), встроенной функции с внешней связью (7.1.2), шаблона класса (раздел 14), шаблона нестатической функции (14.5.6). , статический элемент данных шаблона класса (14.5.1.3), функция-член шаблона класса (14.5.1.1) или специализация шаблона, для которой не указаны некоторые параметры шаблона (14.7, 14.5.5 ) в программе при условии, что каждое определение появляется в отдельной единице перевода, и при условии, что определения удовлетворяют следующим требованиям. [...]
Специализации шаблонов, для которых указаны все параметры (т. е. явные специализации), здесь не перечислены, и в §14.7.3/12 говорится:
Явная специализация шаблона функции является встроенной только в том случае, если она объявлена с помощью спецификатора inline или определена как удаленная, и независимо от того, является ли ее шаблон функции встроенным. [ Пример:
template<class T> void f(T) { /∗ ... ∗/ }
template<class T> inline T g(T) { /∗ ... ∗/ }
template<> inline void f<>(int) { /∗ ... ∗/ } // OK: inline
template<> int g<>(int) { /∗ ... ∗/ } // OK: not inline
— конец примера]
person
jogojapan
schedule
16.07.2013
inline
функций шаблона? - person Oswald   schedule 16.07.2013