这是我一直无法忍受的代码片段。
template <class T, T nt>
class C;
struct base{
int i;
} b;
struct derived : base{} d;
C<base*,&d> obj;
为什么这会给出错误could not convert template argument &d to base*
?
答案 0 :(得分:5)
将参数与作为指针/引用的参数进行匹配时,即使转换在其他情况下有效,也不会考虑派生到基本转换。
14.3 / 5 [标准报价仅供参考]
如果非类型模板参数无法转换为相应模板参数的类型,则程序格式不正确。
...
表示对象类型指针的非类型模板参数,资格转换(4.4)和 应用了数组到指针的转换(4.2)。 [注意:特别是,空指针转换都没有 (4.10)也不应用派生到基础的转换(4.10)。虽然0是有效的模板参数 对于整数类型的非类型模板参数,它不是非类型的有效模板参数 指针类型的模板参数。 ]