【问题标题】:error: cannot convert 'float*' to 'qreal* {aka double*} in initialization错误:无法在初始化中将 'float*' 转换为 'qreal* {aka double*}
【发布时间】:2014-12-28 19:48:11
【问题描述】:

我正在尝试编译旧的 Qt 项目,但遇到了这个错误:

错误:无法将 'float*' 转换为 'qreal* {aka double*}' in 初始化

这是代码片段:

void Camera::loadProjectionMatrix()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
qreal *dataMat = projectionMatrix_.data();
GLfloat matriceArray[16];
for (int i= 0; i < 16; ++i)
    matriceArray[i] = dataMat[i];
glMultMatrixf(matriceArray);
}

我有什么办法可以克服这个错误?

【问题讨论】:

  • projectionMatrix_.data()的数据类型是什么?如果它是浮动的,那么只需使用浮动而不是 qreal。
  • @Archie it's float*
  • 好吧,那就用 float :)
  • 虽然float 可以隐式转换为double,但不能对float* 执行相同的操作。指向一种类型的指针与指向另一种类型的指针非常不同,即使基类型在其他方面是兼容的。您的代码的问题是 float 通常是 32 位,而 double 是 64 位,从数组开头到除第一个(索引零处)以外的任何项目的偏移量与指向 float 的指针不匹配和指向double的指针。
  • @JoachimPileborg:是的,完全正确。

标签: c++ qt opengl mingw


【解决方案1】:

投影矩阵将根据文档返回float*

float * QMatrix4x4::​data()

返回指向该矩阵原始数据的指针。

无论这种情况,最佳做法是在您的代码库中消除 qreal 的使用。当贡献者进行 Qt 5 重构时,qreal 古老的概念被尽可能地丢弃,绝对不应该在 API 处理浮点数的新代码中使用太多。

现在建议在这种情况下使用浮点数。这有点历史,真的。那时,将 qreal 定义为在可用的情况下加倍,但在不可用的情况下浮动是有意义的,例如ARM 平台。请参阅旧文档:

typedef qreal

除了那些使用 ARM 架构的 CPU 之外的所有平台上的双精度类型定义。在基于 ARM 的平台上,出于性能原因,qreal 是浮点类型定义。

在 Qt 5 中,文档略有不同,但主要概念似乎保持不变:

typedef qreal

Typedef for double 除非 Qt 配置了 -qreal float 选项。

我会通过以下方式修复您的代码:

void Camera::loadProjectionMatrix()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float *dataMat = projectionMatrix_.data();
    GLfloat matriceArray[16];
    for (int i= 0; i < 16; ++i)
        matriceArray[i] = dataMat[i];
    glMultMatrixf(matriceArray);
}

严格来说,你也可以换一种方式来解决这个问题,即使用这种方法而不是data()

float & QMatrix4x4::​operator()(int row, int column)

返回对该矩阵中位置(行、列)的元素的引用,以便可以分配该元素。

在这种情况下,您甚至可以消除 dataMat 变量并在迭代中将项目直接分配给您的 matriceArray

更进一步,您应该考虑使用 Qt 库来完成这项常见任务,例如QtGuiQt3D 中的 opengl 类。如果你做一些自定义的事情,弄乱低级的 opengl API 调用会更有意义。

【讨论】:

    【解决方案2】:

    显然,projectionMatrix_.data() 返回一个float*,并且您不能将float* 分配给double*(在这种情况下是qreal*)。

    使用

    float *dataMat = projectionMatrix_.data();
    

    auto dataMat = projectionMatrix_.data();
    

    相反。后者有时的优点是,如果函数的返回类型由于某种原因发生变化,它可能仍然是正确的代码,尽管这对于一个成熟的库来说并不值得期待。此外,您不会在意外中弄错类型。

    【讨论】:

    • qreal 实际上并不是双倍的。只是有时是:)
    • opengl API 在可预见的未来会发生怎样的变化? :)
    • @lpapp 我不知道这个API,返回类型可能取决于我所知道的定义(虽然这将是奇怪的设计:))。第二个原因仍然存在。
    • 不在现实世界中,只是在理论上。你真的认为opengl api会改变吗?
    • @lpapp 我试图澄清有关 API 更改的问题。不过,我仍然没有看到 auto 的缺点。
    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多