#include <iostream>
template<typename T>
void func(T){}
template void func<int>(int);
template<>
void func<int>(int){
}
int main(){
}
考虑上面的代码,clang
和gcc
都抱怨这样的代码格式不正确,如下所示。
explicit specialization of 'func<int>' after instantiation
但是,我只找到类似的规则:
temp.expl.spec#6
如果一个模板,一个成员模板或一个类模板的成员是显式专门化的,则该专门化应在第一次使用该专门化之前声明,该专门化将导致隐式实例化发生,在发生这种使用的每个翻译单元中发生; 不需要诊断。 如果程序没有为显式专门化提供定义,并且专门化的使用方式会导致隐式实例化发生,或者成员是虚拟成员函数,则程序的格式不正确,不需要诊断。 对于声明但未定义的显式专门化,从不生成隐式实例化。
我认为这样的代码并没有违反上面的规则,注意强调的部分,它说隐式实例化
,在我的例子中,这样的声明模板void function
是显式实例化定义,而不是将隐式实例化作为案例的专门化,那么为什么上面的代码格式不正确呢? 上述规范违反了标准中的哪些规定? 请指出这条规则。 谢了。
它有点支离破碎,但这里的相关规则是[temp.spec]/5
对于给定的模板和给定的模板参数集,[...]