首页 > 解决方案 > 专门的模板是否需要专门的声明?

问题描述

我想要一个只为某些类型定义的模板化函数,所以我写:

/* --- header file with just a declaration --- */
template<class T>
void myFunction(T arg);

/* --- cpp file with specialized definition --- */
template<>
void myFunction<int>(int arg){
    // mybody
}

但是我有点困惑,例如阅读this answer。头文件中的声明是否足以让链接器始终链接到相同的特化(静态链接)?还是我需要添加另一个:

template<>
void myFunction<int>(int arg);

在标题中?

标签: c++templateslinkertemplate-specialization

解决方案


您必须从链接的帖子中查看的部分是:

如果模板、成员模板或类模板的成员被显式特化,则应在第一次使用该特化之前声明该特化,这将导致隐式实例化发生,在每个翻译单元中出现这种使用[...]

您可以通过显式实例化声明创建此类声明,该声明告诉编译器显式特化位于其他位置。

在头文件中,您可以将显式实例化声明为

extern template void myFunction(int)

推荐阅读