gpt4 book ai didi

c++ - 普通函数不覆盖模板函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:42 24 4
gpt4 key购买 nike

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

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

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

关于c++ - 普通函数不覆盖模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3754932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com