gpt4 book ai didi

c++ - 函数模板特化的显式实例化

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

我正在尝试创建一个专用于某些给定类型的全局函数模板。它看起来像这样:

A.h(主模板、模板特化、外部)

template <typename T> void foo() { std::cout << "default stuff" << std::endl; }
template<> void foo<int>() { std::cout << "int stuff" << std::endl; }
extern template void foo<int>();

A.cpp(显式实例化)

template void foo<int>();

B.h

void bar();

B.cpp(包括 A.h)

 void bar() { foo<int>(); }

main.cpp

foo<int>();
bar();

编译器在我身上崩溃:“'void foo()' 的多个定义。我认为 extern 应该处理这个问题。B 编译单元不应该实例化 foo,而是在链接处使用 A 实例化时间,不是吗?我在这里弄错了什么?

请注意,如果我不特化 foo,代码编译得很好。函数特化和实例化之间是否存在某种冲突?

最佳答案

你不需要extern这里抑制实例化。通过声明显式特化,您已经告诉任何调用 foo<int> 的代码。使用显式特化而不是主模板。相反,您只想在 A.h 中声明特化,然后在 A.cpp 中定义它:

// A.h
template <typename T> void foo() { std::cout << "default stuff" << std::endl; }
template <> void foo<int>();

// A.cpp
template <> void foo<int>() { std::cout << "int stuff" << std::endl; }

您对 extern 的使用如果您想在某个翻译单元中提供主模板的显式实例化,并且不是显式特化,这将是合适的。

关于c++ - 函数模板特化的显式实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53271119/

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