Нормальная функция не перезаписывает шаблон функции
-
04-10-2019 - |
Вопрос
Я должен использовать внешнюю библиотеку, но я получаю «ошибку нескольких определений» из следующего шаблона функции и его явную специализацию, если она вызывается с помощью STD :: String.
template <typename T>
void foo(T& value);
template <>
void foo(std::string& value);
Даже если я изменю 2-й функцию для
void foo(std::string& value);
Проблема такая же.
Согласно [1], по меньшей мере, версия без шаблона («простая старая функция») должна быть предпочтительной версии шаблона.
У кого-нибудь есть подсказка, где проблема может быть?
Решение
Вы нарушаете правило одно определения.
Если только функция не inline
, это может быть определено только один раз. Если вы отметили функцию как inline
, До тех пор, пока матч определений их можно определить так часто по желанию. Функции шаблонов ведут себя как если бы они были неявно inline
, Так что вы не получаете ошибки с шаблонами.
Однако функция явных специализации или не шаблона неясно inline
и потому что вы включаете его в несколько единиц перевода, вы получаете несколько определений; Это нарушает правило. Вы должны пометить это как inline
:
template <>
inline void foo(std::string& value);
(Если вы получаете это до подключения времени, вам нужно включить охранников.)