提问者:小点点

关于显式实例化和显式专门化顺序的一个问题


#include <iostream>
template<typename T>
void func(T){}

template void func<int>(int);

template<>
void func<int>(int){

}
int main(){

}

考虑上面的代码,clanggcc都抱怨这样的代码格式不正确,如下所示。

explicit specialization of 'func<int>' after instantiation

但是,我只找到类似的规则:
temp.expl.spec#6

如果一个模板,一个成员模板或一个类模板的成员是显式专门化的,则该专门化应在第一次使用该专门化之前声明,该专门化将导致隐式实例化发生,在发生这种使用的每个翻译单元中发生; 不需要诊断。 如果程序没有为显式专门化提供定义,并且专门化的使用方式会导致隐式实例化发生,或者成员是虚拟成员函数,则程序的格式不正确,不需要诊断。 对于声明但未定义的显式专门化,从不生成隐式实例化。

我认为这样的代码并没有违反上面的规则,注意强调的部分,它说隐式实例化,在我的例子中,这样的声明模板void function(int);是显式实例化定义,而不是将隐式实例化作为案例的专门化,那么为什么上面的代码格式不正确呢? 上述规范违反了标准中的哪些规定? 请指出这条规则。 谢了。


共1个答案

匿名用户

它有点支离破碎,但这里的相关规则是[temp.spec]/5

对于给定的模板和给定的模板参数集,[...]

  • 显式实例化和显式专门化声明都不能出现在程序中,除非显式实例化跟在显式专门化声明之后。 [...]