当前位置: 首页 > news >正文

C++报错:没有与参数列表匹配的构造函数 (能确定类型是正确的)

原因:

构造函数定义的参数是“引用类型”,而你使用时,传入了临时变量

背景:

构造函数如下: 

  Ray(Vector3d& p, Vector3d& d);

错误代码如下: 

  Ray r1 = Ray(Vector3d(0.0f,0.0f,3.0f) , Vector3d(0.0f,0.0f,-1.0f));

解决方案如下:

1. 不要用临时变量,新建一个变量,然后把变量作为参数传进去

Vector3d a(0.0f, 0.0f, 3.0f);
Vector3d b(0.0f, 0.0f, -1.0f);
Ray r1 = Ray(a, b);

2. 给构造函数的参数,添加const

Ray(const Vector3d& p, const Vector3d& d);


------分隔-----


下面是AI生成的解析,供参考

对于构造函数 `Ray(Vector3d& p, Vector3d& d)`,你需要提供两个 `Vector3d` 类型的引用作为参数来初始化射线的起点和方向向量。在你的初始化代码中,确实提供了两个 `Vector3d` 对象,但是问题在于这两个对象是临时对象,无法绑定到非常量引用参数上。

具体来说,当你使用 `Vector3d(0.0f, 0.0f, 3.0f)` 和 `Vector3d(0.0f, 0.0f, -1.0f)` 创建临时对象时,它们是不可修改的临时对象,不能与非常量引用绑定。而你的构造函数参数声明为 `Vector3d&`,意味着它需要一个可修改的 `Vector3d` 对象的引用。

为了解决这个问题,你有几种选择:

1. 修改构造函数,使其接受常量引用参数:
   ```cpp
   Ray(const Vector3d& p, const Vector3d& d) : origin_{ p }, directionVector_{ d } {};
   ```

2. 将临时对象转换为可修改的引用对象。但是这种方法并不推荐,因为临时对象的生命周期可能不会长于构造函数调用,这样做可能会导致悬空引用的问题。

3. 将临时对象存储为变量,然后将这些变量传递给构造函数:
   ```cpp
   Vector3d origin(0.0f, 0.0f, 3.0f);
   Vector3d direction(0.0f, 0.0f, -1.0f);
   const Ray camera(origin, direction);
   ```

关于 `Vector3d& p`,`&` 符号是引用符号,表示这个参数是一个引用,而不是一个拷贝。引用允许函数修改调用者提供的实际对象,而不是对象的拷贝。在这种情况下,`Vector3d& p` 接受一个 `Vector3d` 类型的引用作为参数。

相关文章:

  • Docker Compose快速入门
  • MYSQL 二、SQL语句总结 2 (创建和管理表 以及 数据增删改)
  • Flink 生产问题(数据倾斜)
  • Java类和对象(五)—— 抽象类、接口、Object类和内部类
  • JAVA开发 基于最长公共子序列来计算两个字符串之间的重复率
  • 删除链表的倒数第N个节点-力扣
  • GitLab的原理及应用详解(三)
  • 深入解析kube-scheduler的算法自定义插件
  • 软件系统安全设计规范(word原件)
  • 使用Golang开发一个HTTP客户端请求命令行工具
  • Spring 中常用的手动装载 bean 方法
  • 代码随想录训练营Day 38|力扣435. 无重叠区间、763.划分字母区间、56. 合并区间
  • docker实战之搭建MYSQL8.0主从同步
  • C++11function包装器的使用
  • 如何使用Java发送SOAP请求与webservice 服务进行通信
  • ➹使用webpack配置多页面应用(MPA)
  • 2017届校招提前批面试回顾
  • Joomla 2.x, 3.x useful code cheatsheet
  • Js基础知识(一) - 变量
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Mysql数据库的条件查询语句
  • nfs客户端进程变D,延伸linux的lock
  • Python学习之路16-使用API
  • SegmentFault 2015 Top Rank
  • 创建一个Struts2项目maven 方式
  • 分类模型——Logistics Regression
  • - 概述 - 《设计模式(极简c++版)》
  • 前端技术周刊 2019-01-14:客户端存储
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何解决微信端直接跳WAP端
  • 深度解析利用ES6进行Promise封装总结
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • "无招胜有招"nbsp;史上最全的互…
  • # 飞书APP集成平台-数字化落地
  • #NOIP 2014# day.1 T2 联合权值
  • #预处理和函数的对比以及条件编译
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (04)odoo视图操作
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (区间dp) (经典例题) 石子合并
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)视频码率,帧率和分辨率的联系与区别
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core 项目指定SDK版本
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET企业级应用架构设计系列之开场白
  • .NET中GET与SET的用法
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)