Вы нарушаете правило одного определения.
Если функция не является inline
, ее можно определить только один раз.Если вы пометите функцию как inline
, при условии, что определения совпадают, их можно определять так часто, как это необходимо.Функции шаблонов ведут себя так, как если бы они были неявно inline
, поэтому вы не получаете ошибок с шаблонами.
Однако явная специализация или не шаблонная функция неявно inline
и потомуэто в нескольких единицах перевода, вы получаете несколько определений;это нарушает правило.Вы должны пометить его как inline
:
template <>
inline void foo(std::string& value);
(Если вы получаете это до времени ссылки, вам нужно включить охранников.)