正常功能不是覆盖模板功能
-
04-10-2019 - |
题
我必须使用外部库,但是如果使用std :: string被调用,请从以下模板函数及其明确的专业化中获得“多重定义错误”。
template <typename T>
void foo(T& value);
template <>
void foo(std::string& value);
即使我将第二个功能更改为
void foo(std::string& value);
问题是一样的。
根据[1],至少没有模板的版本(“普通旧功能”)优于模板版本。
有人有线索,问题可能在哪里?
解决方案
您正在打破一定的定义规则。
除非功能是 inline
, ,只能定义一次。如果将功能标记为 inline
, ,只要定义匹配它们,它们就可以根据需要定义。模板功能的行为就像是隐式 inline
, ,因此您不会因模板而遇到错误。
但是,明确的专业化或非模板功能并非隐含 inline
而且由于您将其包括在多个翻译单元中,因此您会得到多个定义。这打破了规则。你应该将其标记为 inline
:
template <>
inline void foo(std::string& value);
(如果您在链接时间之前获得此功能,则需要包括警卫。)
不隶属于 StackOverflow