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

原因:

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

背景:

构造函数如下:

cpp 复制代码
  Ray(Vector3d& p, Vector3d& d);

错误代码如下:

cpp 复制代码
  Ray r1 = Ray(Vector3d(0.0f,0.0f,3.0f) , Vector3d(0.0f,0.0f,-1.0f));

解决方案如下:

  1. 不要用临时变量,新建一个变量,然后把变量作为参数传进去
cpp 复制代码
Vector3d a(0.0f, 0.0f, 3.0f);
Vector3d b(0.0f, 0.0f, -1.0f);
Ray r1 = Ray(a, b);
  1. 给构造函数的参数,添加const
cpp 复制代码
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` 类型的引用作为参数。

相关推荐
冻柠檬飞冰走茶1 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing031 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊1 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
波力海苔夹心脆6752 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩3 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
Hhy_11075 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
starzy19905 小时前
深入理解Scala函数定义:从方法到函数的类型跨越
开发语言·scala
starzy19905 小时前
深入理解Scala递归函数:从栈溢出到尾调用优化
开发语言·scala
三*一5 小时前
Mapbox‑GL JS 多边形折点编辑工具:实现原理、功能拆解与踩坑总结
开发语言·javascript·ecmascript
青少儿编程课堂5 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛