【问题标题】:Const Discards Qualifers: C++Const 丢弃限定符:C++
【发布时间】:2011-11-12 01:26:24
【问题描述】:

我正在使用 OpenGL 来渲染相机透视图,并且在我的代码中的一个点我试图获取光的方向(此处显示为“Vector4”类型)并将其乘以“Matrix4x4”类型的矩阵" 代表模型视图转换(对不起,如果这没有任何意义,这是一个学校项目,因此我仍在学习这些东西)无论如何,我的代码如下......

Vector4 lightDirection = data->dir * follow->getModelviewMatrix().getInverse().getTranspose();
data->dir = lightDirection;
setLight(*data);

这给了我以下错误:

passing 'const vec4<double>' as 'this' argument of 'vec4<T>& vec4<T>::operator=(const vec4<T>&)[with T = double]' discards qualifiers

同样,大部分代码都是为类预先编写的(即向量和矩阵类型),但如果有人能帮助我破译错误的含义,将不胜感激!我可以根据需要提供更多信息。

我认为 'data' 或 'data->dir' 是 const,但我找不到它们中的任何一个。 'dir' 是 SceneLightData 类型,当它被添加时,我正在这样做:

void Scene::addLight(const SceneLightData &sceneLight)
{
    SceneLightData light = sceneLight;

    m_lights.push_back(&light);
}

错误发生在这一行:

data->dir = lightDirection;

编辑

问题解决了。感谢大家!解决方案:

void Scene::addLight(const SceneLightData &sceneLight)
{
    SceneLightData* light = new SceneLightData;
    *light = sceneLight;

    m_lights.push_back(light);
}

SceneLightData* data = m_lights[i];

data->dir = data->dir * follow->getModelviewMatrix().getInverse().getTranspose();         
setLight(*data);

【问题讨论】:

  • Vector4typedef 还是 const vec4&lt;double&gt;
  • 哦,等等,您在data-&gt;dir = lightDirection;? 的行上收到此错误?
  • light 在退出 addLight 时不再存在,因此您添加到 m_lights 的指针将在函数返回时无效。你应该做m_lights.push_back(new SceneLightData(sceneLight)); 并确保它在从m_lights 删除或Scene 破坏时被删除。
  • data的类型是什么?请提供data 的声明,以及它碰巧是什么类型的定义(或指向的类型的定义)。

标签: c++ constants qualifiers


【解决方案1】:

data-&gt;dir 是常量。这意味着您无法更改它,并且您正在尝试为其分配不同的值,这就是编译器对您生气的原因。请参阅const-correctness 了解更多信息。

【讨论】:

  • 这就是我的想法,但是我找不到任何提到 dir 或 data 是 const 的。 'dir' 如果是 SceneLightData 类型,当它被添加时我正在这样做: void Scene::addLight(const SceneLightData &sceneLight) { SceneLightData light = sceneLight; m_lights.push_back(&light); }
  • @user991673: O_o 该代码看起来有问题。您正在获取堆栈分配对象的地址,然后离开该对象存在的范围。在稍后的某个阶段尝试通过该指针访问light 的结果是未定义的。
  • dir 不太可能是const。您需要查看 data 的声明位置。是局部变量吗?传递给函数的参数?
  • 是的,我对此并不满意。如果我不希望我的 m_lights 向量的成员为 const,如果我得到一个,我该怎么办?我试过使用 const_cast 但它从未正确遵守它......
【解决方案2】:

出现此错误是因为您试图在 const 对象上调用非 const 成员函数。在您的代码中的某个时刻,您正在调用 const vec4&lt;double&gt; 的赋值运算符。

赋值运算符 (operator=) 是非常量的,因为赋值给一个对象会修改被赋值的对象(赋予它新的值)。

从您的示例中不清楚问题究竟发生在哪里。如果您仍然遇到问题,请尝试将示例缩减为演示问题的最小完整程序,我们可以进一步解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多