C++ 模板特化规则中提到的特化必须比主模板更加特化。下面的 #1 代码片段会导致编译错误,这表明第二行并不更专业,但最后一个片段 (#2) 的工作看起来非常接近 #1。两个代码片段都是专门的int N
as 0
,那么为什么第一个片段被抱怨为“不更专业”呢?
// #1
template<int N, typename T1, typename... Ts> struct B;
template<typename... Ts> struct B<0, Ts...> { }; // Error: not more specialized
// #2
template<int N, typename T1, typename... Ts> struct B;
template<typename T, typename... Ts> struct B<0, T, Ts...> { }; // this works
For 更专业 https://en.cppreference.com/w/cpp/language/partial_specialization#Partial_ordering:
非正式地,“A 比 B 更专业”意味着“A 接受 B 接受的类型的子集”。
无论专业化可以接受什么类型,都应该是主模板可以接受的类型的子集。但对于B<0>
,它只能被专业化接受,而主模板则不能,因为模板参数T1
是必不可少的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)