我必须使用外部库,但如果使用 std::string 调用它,则会从以下模板函数及其显式特化中收到“多重定义错误”。
template <typename T>
void foo(T& value);
template <>
void foo(std::string& value);
即使我将第二个函数更改为
void foo(std::string& value);
问题是一样的。
根据[1],至少没有模板的版本(“普通旧函数”)应该优于模板版本。
有人知道问题出在哪里吗?
最佳答案
您违反了单一定义规则。
除非函数是内联
,否则它只能定义一次。如果您将函数标记为内联,只要定义匹配,就可以根据需要多次定义它们。模板函数的行为就像隐式内联
一样,因此您不会遇到模板错误。
但是,显式特化或非模板函数并不是隐式内联的,并且因为您将其包含在多个翻译单元中,所以您会获得多个定义;这违反了规则。您应该将其标记为内联
:
template <>
inline void foo(std::string& value);
(如果您在链接时间之前收到此消息,则需要包含防护措施。)
关于c++ - 普通函数不会覆盖模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3754932/