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

发布于 2024-11-03 14:50:29 字数 232 浏览 1 评论 0原文

这是我一直无药可救地坚持的代码片段。

template <class T, T nt>
class C;

struct base{
   int i;
} b;

struct derived : base{} d;

C<base*,&d> obj;

为什么会出现此错误无法将模板参数 &d 转换为 base*

This is the code snippet I have been hopelessly stuck on.

template <class T, T nt>
class C;

struct base{
   int i;
} b;

struct derived : base{} d;

C<base*,&d> obj;

Why this giving error could not convert template argument &d to base*?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我还不会笑 2024-11-10 14:50:29

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

14.3/5 【标准报价仅供参考】

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

...

对于指向对象的类型指针的非类型模板参数,限定转换 (4.4) 和
应用数组到指针的转换(4.2)。 [注意:特别是,空指针转换
(4.10) 也不应用派生到基数的转换 (4.10)。尽管 0 是有效的模板参数
对于整型的非类型模板参数,它不是非类型的有效模板参数
指针类型的模板参数。 ]

When matching an argument to a parameter that is a pointer/reference, derived to base conversions are not considered even if the conversions are valid in other circumstances.

14.3/5 [Standard quote just for reference]

If a non-type template-argument cannot be converted to the type of the corresponding template-parameter then the program is ill-formed.

....

for a non-type template-parameter of type pointer to object, qualification conversions (4.4) and the
array-to-pointer conversion (4.2) are applied. [Note: In particular, neither the null pointer conversion
(4.10) nor the derived-to-base conversion (4.10) are applied. Although 0 is a valid template-argument
for a non-type template-parameter of integral type, it is not a valid template-argument for a non-type
template-parameter of pointer type. ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文