我必须使用外部库,但是如果使用std :: string调用它,则会从以下模板函数及其显式特化中获得“多重定义错误”。
template <typename T>
void foo(T& value);
template <>
void foo(std::string& value);
即使我将第二个功能更改为
void foo(std::string& value);
问题是一样的。
根据[1],至少没有模板的版本(“普通旧函数”)应该优先于模板版本。
有没有人知道问题出在哪里?
答案 0 :(得分:3)
你违反了单一定义规则。
除非函数为inline
,否则只能定义一次。如果将函数标记为inline
,只要定义匹配,就可以根据需要定义它们。模板函数的行为就像隐式inline
一样,因此模板不会出错。
但是,显式特化或非模板函数不是隐式inline
,因为您将它包含在多个翻译单元中,您将得到多个定义;这打破了规则。您应将其标记为inline
:
template <>
inline void foo(std::string& value);
(如果你在链接时间之前得到这个,你需要包括警卫。)