Tou*_*dou 4 c++ templates explicit instantiation specialization
我正在尝试创建一个专门用于某些给定类型的全局函数模板。它看起来像这样:
啊(主模板,模板特化,extern)
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>();
Run Code Online (Sandbox Code Playgroud)
A.cpp(显式实例化)
template void foo<int>();
Run Code Online (Sandbox Code Playgroud)
乙
void bar();
Run Code Online (Sandbox Code Playgroud)
B.cpp(包括啊)
void bar() { foo<int>(); }
Run Code Online (Sandbox Code Playgroud)
主程序
foo<int>();
bar();
Run Code Online (Sandbox Code Playgroud)
编译器让我崩溃:“'void foo()' 的多个定义。我认为 extern 应该处理这个问题。B 编译单元不应该实例化 foo,而是在链接时使用 A 实例化,没有? 我哪里错了?
请注意,如果我不专门化 foo,则代码编译得很好。函数特化和实例化之间是否存在某种冲突?
你不需要extern在这里抑制实例化。通过声明显式特化,您已经告诉任何调用foo<int>使用显式特化而不是主模板的代码。相反,您只想在 Ah 中声明特化,然后在 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; }
Run Code Online (Sandbox Code Playgroud)
extern如果您想在某个翻译单元中提供主模板的显式实例,而不是显式专业化,那么您的使用将是合适的。