C ++标准规定如下:
在类模板成员或成员模板的显式专门化声明中 出现在命名空间范围内,成员模板及其某些封闭类模板可能会保留 unspecialized,除了声明不应该明确地专门化类成员模板 封闭类模板也没有明确专门化。 (自旧标准以来,C ++ 11和14.7.3 / 18中的14.7.3 / 16)
这意味着以下情况不可能:
template<typename T>
class foo {
template<typename U>
void bar();
};
template<typename T>
template<>
void foo<T>::bar<some_type>(){
}
人们已经有多个与此相关的问题,这些问题或多或少地得到了“标准所说”的回答。我不太明白为什么存在这种限制。
答案 0 :(得分:0)
感谢JohnB的回答:
在这种情况下,只有一个专门化的类(例如T=int
)和另一个专门化的专业化(例如U=int
),就不可能决定哪个专业化使用。
skyjpack的另一点:
可能没有成员函数的类专门化。
答案 1 :(得分:0)
模板函数在首次使用或专用时实例化。
当您进行部分特化时,您无法实例化函数,因为它仍然是模板函数。因此,当你进行专业化时,编译器必须明白你已经有部分实例化并将它与你的实例化相匹配,这可能会导致困难。
人们在评论中说,它可能导致歧义,但很多事情都可能导致模棱两可的事情。例如,可以考虑重载功能。如果调用重载函数是不明确的,编译器会告诉你它。在这种情况下也一样。