Нормальная функция не перезаписывает шаблонную функцию

Я должен использовать внешнюю библиотеку, но получаю "ошибку множественного определения" из следующей функции шаблона и ее явной специализации, если ее вызывают с помощью 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 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам