专用模板是否需要专用声明?

时间:2018-09-26 21:42:57

标签: c++ templates linker template-specialization

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

/* --- 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);

在标题中要

1 个答案:

答案 0 :(得分:1)

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

  

如果一个模板,一个成员模板或一个类模板的成员被明确地专门化,则应在每个翻译单元中首次使用该专门化之前声明该专门化,这将导致发生隐式实例化。发生这种用途的情况 [...]

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

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

 var url = '@Url.Action("StateData", "Visualizations")' + '?StateID=' + selection;