书C++模板:完整指南在第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;
};
Run Code Online (Sandbox Code Playgroud)
不幸的是,部分专业化
Promotion<Array<T1>, Array<T2> >既不比专业化更专业化也更不专业化Promotion<T,T>.为避免模板选择模糊,添加了最后的部分特化.它比前两个部分特化中的任何一个都更专业.
为什么前两个模板不明确,为什么最后一个模板解决了模糊问题?当我尝试应用规则时,我或者无法弄清楚它是如何产生歧义的,或者如果我认为我有办法让它发生,我不知道为什么最后一个模板解决了问题.