【问题标题】:Partial template specialization ambiguity部分模板专业化歧义
【发布时间】:2011-12-26 15:45:41
【问题描述】:

我不明白为什么 main 中的语句模棱两可。

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&lt;int, T*, 10&gt; 不是最专业的模板吗? 这是来自http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fpartial_specialization.htm的示例

【问题讨论】:

  • 原因如下示例:编译器不允许声明X&lt;int, int*, 10&gt; f,因为它可以匹配模板结构X&lt;T, T*, I&gt;、模板结构X&lt;int, T*, 10&gt;或模板结构X&lt;T, U*, I&gt;,并且这些声明中没有一个比其他声明更匹配。

标签: c++ templates template-specialization specialization partial-specialization


【解决方案1】:

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

查看X&lt;int, T*, 10&gt;X&lt;T, T*, I&gt; 时:

  • X&lt;int, float*, 10&gt; 匹配第一个但不匹配第二个。
  • X&lt;float, float*, 10&gt; 匹配第二个但不匹配第一个。

因此,两者都不比另一个更特化,并且匹配这两种特化的模板实例化将无法编译。

【讨论】:

  • 还提到了类模板特化的偏序,这又依赖于由类模板特化的模板参数组成的重载函数模板的偏序。
  • @Nawaz:我知道这是他们在标准中解释它的方式,但我认为我认为在这里解释这一切会使事情变得过于复杂而没有什么好处(我还需要解释规则用于从 14.5.5.2 开始的函数模板排序,以及从 14.8.2 开始的模板参数推导)。如果您认为这需要更多详细信息,请随时添加答案。
  • 谢谢,现在我明白了。我已经阅读了最后的解释,但我不明白为什么X&lt;int, T*, 10&gt; 不是最专业的。
猜你喜欢
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多