为什么在没有专门化课程的情况下不允许成员的明确专业化?

时间:2016-06-13 11:12:42

标签: c++ templates standards language-lawyer explicit-specialization

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>(){
}

人们已经有多个与此相关的问题,这些问题或多或少地得到了“标准所说”的回答。我不太明白为什么存在这种限制。

2 个答案:

答案 0 :(得分:0)

感谢JohnB的回答:

在这种情况下,只有一个专门化的类(例如T=int)和另一个专门化的专业化(例如U=int),就不可能决定哪个专业化使用。

skyjpack的另一点:

可能没有成员函数的类专门化。

答案 1 :(得分:0)

模板函数在首次使用或专用时实例化。

当您进行部分特化时,您无法实例化函数,因为它仍然是模板函数。因此,当你进行专业化时,编译器必须明白你已经有部分实例化并将它与你的实例化相匹配,这可能会导致困难。

人们在评论中说,它可能导致歧义,但很多事情都可能导致模棱两可的事情。例如,可以考虑重载功能。如果调用重载函数是不明确的,编译器会告诉你它。在这种情况下也一样。