Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top