C++ 标准规定如下:
在类模板的成员或出现在命名空间范围内的成员模板的显式特化声明中,成员模板和它的一些封闭类模板可能保持未特化,除非声明不应显式特化类成员模板,如果它封闭类模板也没有明确专门化。(自 C++11 以来的 14.7.3/16 和旧标准中的 14.7.3/18)
这意味着以下情况是不可能的:
template<typename T>
class foo {
template<typename U>
void bar();
};
template<typename T>
template<>
void foo<T>::bar<some_type>(){
}
已经有多个问题与此相关,这些问题或多或少都被“标准这么说”回答了。我真的不明白为什么存在这个限制。