首页 > 后端开发 > C++ > 正文

为什么模板参数推导中隐式类型转换失败?

Barbara Streisand
发布: 2024-10-28 23:17:30
原创
847 人浏览过

Why Does Implicit Type Conversion Fail in Template Argument Deduction?

隐式类型转换和模板推导

在 C 语言中,模板参数推导是一种允许根据类型参数自动推断出类型参数的机制。函数参数。然而,模板推导中的隐式类型转换是有限制的。

考虑下面的代码片段:

<code class="cpp">#include<iostream>
using namespace std;

template<typename Dtype>
class Scalar{
public:
  Scalar(Dtype v) : value_(v){}
private:
  Dtype value_;
};

template<typename Dtype>
void func(int a, Scalar<Dtype> b){ 
  cout << "ok" <<endl;
}

int main(){
  int a = 1;
  func(a, 2); // error: no matching function for call to ‘func(int&, int)’
  return 0;
}
登录后复制

这里,目标是使用整数调用 func() 模板函数a 和隐式转换的 Scalar对象 2。但是,这会导致编译错误。这是为什么?

理解错误

编译器无法执行模板参数推导,因为:

  • 未考虑隐式类型转换在模板参数推导过程中。
  • 从 int 到 Scalar 的转换是用户定义的转换,编译器在推导时无法识别。

解决方案选项

要解决此问题,可以采取多种方法:

  • 在调用方显式转换:
    在调用方手动转换参数:

    <code class="cpp">func(a, Scalar<int>{2});</code>
    登录后复制
  • 推导指南(C 17 ):
    为 Scalar 定义推导指南,并调用 func() 为:

    <code class="cpp">func(a, Scalar{2});</code>
    登录后复制
  • 显式模板实例化(仅当标量构造函数不显式时):
    显式实例化所需类型参数的 func() 模板:

    <code class="cpp">func<int>(a, 2); </code>
    登录后复制

结论

C 中的模板参数推导是一种强大的机制,但在处理用户定义的转换时它有局限性。通过利用所讨论的解决方案,开发人员可以确保使用预期的类型参数调用模板函数。

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

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