问题 部分模板专业化歧义


我不明白为什么主要陈述含糊不清。

template<class T, class U, int I> struct X
{ void f() { cout << "Primary template" << endl; } };


template<class T, int I> struct X<T, T*, I>
{void f() { cout << "Partial specialization 1" << endl;}};

template<class T, class U, int I> struct X<T*, U, I>
{void f() { cout << "Partial specialization 2" << endl;}};

template<class T> struct X<int, T*, 10>
{void f() { cout << "Partial specialization 3" << endl;}};

template<class T, class U, int I> struct X<T, U*, I>
{void f() { cout << "Partial specialization 4" << endl;}};

 int main()
 {
   X<int, int*, 10> f;
 }

是不是 X<int, T*, 10> 最专业的模板? 这是一个例子 http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fpartial_specialization.htm


3147
2017-12-26 15:45


起源

原因在下面的示例中给出:编译器不允许声明 X<int, int*, 10> f因为它可以匹配模板结构 X<T, T*, I>,模板结构 X<int, T*, 10>或模板结构 X<T, U*, I>,这些声明都不比其他声明更好。 - Mr.Anubis


答案:


如果与第一个匹配的每个参数列表也与第二个匹配,则模板特化比另一个更专业化,但不是相反。

看着 X<int, T*, 10> 和 X<T, T*, I>

  • X<int, float*, 10> 匹配第一个而不是第二个。
  • X<float, float*, 10> 匹配第二个但不是第一个。

因此,两者都不比另一个更专业,并且匹配两个特化的模板实例化将不会编译。


10
2017-12-26 16:16



还要提到类模板特化的部分排序,而这又取决于类的部分排序 超载 由类模板特化的模板参数组成的函数模板。 - Nawaz
@Nawaz:我知道这就是他们在标准中解释它的方式,但我认为我认为它会使事情过于复杂而在这里解释一下(我还需要从14.5.5.2解释函数模板排序的规则) ,以及14.8.2中的模板参数推导。如果您认为需要更多详细信息,请随意添加答案。 - interjay
谢谢,现在我明白了。我最后已经阅读了解释,但我无法弄清楚原因 X<int, T*, 10> 不是最专业的。 - user1116459