正常功能不会覆盖模板功能

时间:2010-09-20 19:45:51

标签: c++ templates overloading explicit-specialization

我必须使用外部库,但是如果使用std :: string调用它,则会从以下模板函数及其显式特化中获得“多重定义错误”。

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

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

即使我将第二个功能更改为

void foo(std::string& value);

问题是一样的。

根据[1],至少没有模板的版本(“普通旧函数”)应该优先于模板版本。

有没有人知道问题出在哪里?

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

1 个答案:

答案 0 :(得分:3)

你违反了单一定义规则。

除非函数为inline,否则只能定义一次。如果将函数标记为inline,只要定义匹配,就可以根据需要定义它们。模板函数的行为就像隐式inline一样,因此模板不会出错。

但是,显式特化或非模板函数不是隐式inline,因为您将它包含在多个翻译单元中,您将得到多个定义;这打破了规则。您应将其标记为inline

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

(如果你在链接时间之前得到这个,你需要包括警卫。)