1

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

已经有多个问题与此相关,这些问题或多或少都被“标准这么说”回答了。我真的不明白为什么存在这个限制。

4

2 回答 2

0

感谢 JohnB 的回答:

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

skyjpack的另一点:

可能存在没有成员函数的类特化。

于 2016-06-13T11:29:09.510 回答
0

模板函数在第一次使用或专门化时被实例化。

当您进行部分特化时,您无法实例化函数,因为它仍然是模板函数。因此,当您进行特化时,编译器必须以某种方式了解您已经进行了部分实例化并将其与您的实例化相匹配,这可能会导致困难。

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

于 2016-06-13T11:31:45.497 回答