Нормальная функция не перезаписывает шаблонную функцию - PullRequest
2 голосов
/ 20 сентября 2010

Мне нужно использовать внешнюю библиотеку, но я получаю «ошибку множественного определения» из следующей функции шаблона и ее явной специализации, если ее вызывают с помощью std :: string.

template <typename T>
void foo(T& value);

template <>
void foo(std::string& value);

если я изменю 2-ю функцию на

void foo(std::string& value);

, проблема будет та же.

Согласно [1] по крайней мере версия без шаблона («простая старая функция») должна бытьпредпочтительнее шаблонной версии.

У кого-нибудь есть подсказка, где может быть проблема?

[1] http://www.gotw.ca/publications/mill17.htm

1 Ответ

3 голосов
/ 20 сентября 2010

Вы нарушаете правило одного определения.

Если функция не является inline, ее можно определить только один раз.Если вы пометите функцию как inline, при условии, что определения совпадают, их можно определять так часто, как это необходимо.Функции шаблонов ведут себя так, как если бы они были неявно inline, поэтому вы не получаете ошибок с шаблонами.

Однако явная специализация или не шаблонная функция неявно inline и потомуэто в нескольких единицах перевода, вы получаете несколько определений;это нарушает правило.Вы должны пометить его как inline:

template <>
inline void foo(std::string& value);

(Если вы получаете это до времени ссылки, вам нужно включить охранников.)

...