C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 为什么这些模板不明确?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
书籍 C++ Templates : The Complete Guide在第275页有一个例子,我无法绕过头脑.

引用书中的摘录……

template <typename T>
class Promotion<T,T> {
  public:
    typdef T ResultT;
};

template<typename T1,typename T2>
class Promotion<Array<T1>,Array<T2> > {
  public:
    typedef Array<typename Promotion<T1,T2>::resultT> ResultT;
};

template<typename T>
class Promotion<Array<T>,Array<T> > {
  public:
    typedef Array<typename Promotion<T,T>::resultT> ResultT;
};

为什么前两个模板不明确,为什么最后一个模板解决了模糊问题?当我尝试应用规则时,我或者无法弄清楚它是如何产生歧义的,或者如果我认为我有办法让它发生,我不知道为什么最后一个模板解决了问题.

解决方法

也许你的困惑源于这种关系“更专业而非”的关系.这是一个部分订单,而不是一个总订单 – 这意味着给定2个模板特化,并不总是一个比另一个更专业.

Anon的评论是正确的:假设第3个专业化不存在,后来你的代码中有:

Promotion<Array<double>,Array<double> > foo;

(当然你可能实际上不会创建这个空结构类型的变量,但这只是强制实例化的最简单方法.)

鉴于这个foo的声明,将挑选前两个专业中的哪一个

>专业化1适用,T = Array< double>.
>专业化2适用,T1 =双,T2 =双.

这两个专业都是适用的,所以我们需要确定哪个“比另一个更专业”,并选择那个.怎么样?我们会说X比Y更专业,如果它至少和Y一样专业,但Y至少不像X那样专业.然看起来这只是围绕这个问题跳舞,但我们有一个聪明的规则可以用来回答这个新问题:

如果不管我们为X的模板参数分配了什么类型,则X至少与Y一样专用,结果类型总是可以与Y匹配.

请注意,我们忘记了当前实例化中涉及的特定类型(在这种情况下,为doublE) – “至少是如此专用”关系是部分特化本身的属性,并且不依赖于特定的实例化.

专业化1总是可以与专业化2相匹配吗?这个过程有点像代数.我们要求对于任何类型T,我们可以找到类型T1和T2,这样:

Promotion<Array<T1>,Array<T2> > = Promotion<T,T>

这意味着:

Array<T1> = T
Array<T2> = T

所以答案是否定的.仅虑第一个隐含结果,给定任何类型T,通常不可能找到类型T1,使得阵列< T1>与T的类型相同(如果T恰好是Array< long>,它会起作用,但如果T是int或char *或大多数其他类型则不行.)

反过来呢?专业化2总能与专业化1相匹配吗?我们要求对于任何类型T1和T2,我们可以找到类型T,以便

Promotion<T,T> = Promotion<Array<T1>,Array<T2> >

这意味着:

T = Array<T1>
T = Array<T2>

所以答案是否定的.给定任何类型T1,总是可以找到类型T,使得T与Array< T1>的类型相同. – 只是字面上设置T = Array< T1>.但一般情况下,其他类型T2不会被限制为与T1相同,如果不是(例如,如果T1 = bool但T2 =浮动)那么就不可能找到类型T与Array< ; T1>和阵列< T2>.所以一般来说,找不到这样的类型是不可能的.

在这种情况下,不仅专业化比其他专业化更专业化,甚至也不像其他专业化那样专业化.因此,如果需要实例化此模板类并且两个特化项都匹配 – 就像在Anon给出的示例中那样 – 没有办法选择“最佳”.

大佬总结

以上是大佬教程为你收集整理的c – 为什么这些模板不明确?全部内容,希望文章能够帮你解决c – 为什么这些模板不明确?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。