2

我必须使用外部库,但是如果使用 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

4

1 回答 1

3

你打破了单一定义规则。

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

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

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

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

于 2010-09-20T19:56:27.040 回答