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>(){
}
人们有与此相关的问题,已经有多个问题,“标准说得差不多”可以回答这些问题。我真正不了解的是为什么存在此限制。
最佳答案
感谢JohnB的回答:
在这种情况下,仅针对某个类(例如T=int
)有一个专门化,而仅针对成员(例如U=int
)有另一个专门化,则无法决定要使用哪种专门化。
skyjpack的另一点:
如果没有成员函数,可能会有一个类专门化。
关于c++ - 为什么不对类进行专门化就不允许成员的显式专门化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37788300/