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

标签 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

最佳答案

您违反了单一定义规则。

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

但是,显式特化或非模板函数并不是隐式内联的,并且因为您将其包含在多个翻译单元中,所以您会获得多个定义;这违反了规则。您应该将其标记为内联:

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

(如果您在链接时间之前收到此消息,则需要包含防护措施。)

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

相关文章:

java - javadoc 在 `Class.getDeclaredMethod` 上的混淆

java - 重载采用通用类型的方法会导致模棱两可的方法调用编译错误

typescript - 如何从 typescript 中的参数推断或推导返回类型

c++ - 防止 g++ 添加额外的 elf 部分

c++ - 为 boost::property_tree::ptree 移动构造函数

c++ - 如何通过函数的 void 指针参数传递一个 int 值并将其转换回 int 值?

c++ - 将仅包含 C++ header 的模板编译为共享库

c++ - 如何避免 C++ 类模板中的无限递归

c++ - 带有额外可选模板参数的标准库容器?

c++ - 生成没有srand的随机数