首页 > 后端开发 > C++ > 为什么模板参数推导在非推导上下文中失败?

为什么模板参数推导在非推导上下文中失败?

Mary-Kate Olsen
发布: 2024-11-29 06:29:12
原创
322 人浏览过

Why Does Template Argument Deduction Fail in Nondeduced Contexts?

模板参数推导和非推导上下文

在 C 中,模板参数推导允许编译器根据类型确定模板参数的类型传递给模板函数或类的参数。但是,在涉及非推导上下文的某些场景中,此机制可能会失败。

考虑以下代码片段:

template <class T>
struct S {
    typedef T& type;
};

template <class A>
A temp(S<A>::type a1) {
    return a1;
}

template <class A, class B>
B temp2(S<A>::type a1, B a2) {
    return a1 + a2;
}
登录后复制

这里,S 结构体用作获取对该类型的引用的一种方式由模板参数 A 保存。但是,当尝试使用整数值调用这些函数时,如下所示,编译器报告错误:

int main() {
    char c = 6;
    int d = 7;
    int res = temp(c);
    int res2 = temp2(d, 7);
}
登录后复制

错误消息:

  • 错误 1:temp(S::type):无法推导出 A
  • 的模板参数
  • 错误 2:temp2(S::type,B):无法推断出模板参数A

解释:

出现此问题是因为 A 的类型仅在非推导上下文中使用,这意味着编译器无法从参数推断出它传递给函数。特别是, S::type 被认为是非推导的,因为它出现在嵌套模板类型中,并且与 temp 或 temp2 的参数没有直接关系。

解决方案:

要解决此问题并启用模板参数推导,必须在调用函数时显式指定 A 的类型,如下所示下面:

temp<char>(c);
登录后复制

这个显式规范允许编译器确定 A 的类型并成功实例化模板函数。

以上是为什么模板参数推导在非推导上下文中失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板