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

有帮助吗?

解决方案

您正在打破一定的定义规则。

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

但是,明确的专业化或非模板功能并非隐含 inline 而且由于您将其包括在多个翻译单元中,因此您会得到多个定义。这打破了规则。你应该将其标记为 inline:

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

(如果您在链接时间之前获得此功能,则需要包括警卫。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top