模板参数中的派生类类型无法编译

时间:2011-04-27 12:56:00

标签: c++ templates

这是我一直无法忍受的代码片段。

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*

1 个答案:

答案 0 :(得分:5)

将参数与作为指针/引用的参数进行匹配时,即使转换在其他情况下有效,也不会考虑派生到基本转换。

14.3 / 5 [标准报价仅供参考]

  

如果非类型模板参数无法转换为相应模板参数的类型,则程序格式不正确。

     

...

     

表示对象类型指针的非类型模板参数,资格转换(4.4)和   应用了数组到指针的转换(4.2)。 [注意:特别是,空指针转换都没有   (4.10)也不应用派生到基础的转换(4.10)。虽然0是有效的模板参数   对于整数类型的非类型模板参数,它不是非类型的有效模板参数   指针类型的模板参数。 ]