C++ 常量丢弃限定符:C++;

C++ 常量丢弃限定符:C++;,c++,constants,qualifiers,C++,Constants,Qualifiers,我正在使用OpenGL渲染相机透视图,在我的代码中,我试图取光的方向(这里显示为“Vector4”类型),并将其乘以表示模型视图转换的“Matrix4x4”类型的矩阵(很抱歉,如果这没有任何意义,这是一个学校项目,因此我仍在学习这些东西)无论如何,我的代码如下 Vector4 lightDirection = data->dir * follow->getModelviewMatrix().getInverse().getTranspose(); data->dir = lig

我正在使用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->dir = lightDirection;
编辑

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

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

    m_lights.push_back(light);
}


data->dir
是常量。这意味着您无法更改它,并且您正试图为它分配一个不同的值,这就是编译器对您生气的原因。有关详细信息,请参阅。

data->dir
是常量。这意味着您无法更改它,并且您正试图为它分配一个不同的值,这就是编译器对您生气的原因u、 有关详细信息,请参阅。

发生此错误的原因是您试图调用常量对象上的非常量成员函数。在代码中的某个点,您正在调用
常量vec4的赋值运算符

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


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

发生此错误是因为您试图在常量对象上调用非常量成员函数。在某一点上,我在您的代码中,您正在调用常量vec4的赋值运算符

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



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

Vector4
a
typedef
of
const vec4
?哦,等等,您在说
data->dir=lightDirection;
light
在退出
addLight
时不再存在,因此您添加到
m_lights
的指针在函数返回时将无效。您应该执行
m_lights。推回(新SceneLightData(sceneLight))
并确保在从
m_lights
移除或
场景
销毁时将其删除。
数据
的类型是什么?请提供
数据
的声明,以及它恰好是什么类型的定义(或是指针指向的类型的定义).是
const vec4
typedef
Vector4
a
typedef
?哦,等等,您在说
data->dir=lightDirection;
的行中得到这个错误,退出
addLight
时,
灯不再存在,因此您添加到
m灯的指针在函数返回时将无效。您应该执行
m_灯光。向后推(新的SceneLightData(sceneLight));
并确保在从
m_lights
Scene
销毁时将其删除。数据的类型是什么?
?请提供
数据的声明,以及它恰好是什么类型的定义(或者是指针指向的类型的定义)。这就是我的想法,但是我找不到关于dir或data是const的任何提及。“dir”如果是SceneLightData类型,当它被添加时,我会这样做:void Scene::addLight(const SceneLightData&sceneLight){SceneLightData light=sceneLight;m_lights.push_back(&light); }@user991673:如果
dir
本身是常量,则
dir
内部的
data
将自动保持常量,我相信这就是您的情况。@user991673:O该代码看起来有问题。您正在获取堆栈分配对象的地址,然后离开该对象存在的范围。尝试访问ss
light
在后面的某个阶段通过该指针是未定义的。
dir
不太可能是
const
。您需要查看
数据的声明位置。它是局部变量吗?是传递给函数的参数吗?是的,我对此不满意。如果我不希望m_lights向量的成员是const,如果给我一个,我会怎么做?我试过使用const_cast,但它从来没有正确地符合它…这就是我的想法,但是我找不到任何关于dir或data的内容是const。'dir'如果是SceneLightData类型,当它被添加时,我会这样做:void Scene::addLight(const SceneLightData&sceneLight){SceneLightData light=sceneLight;m_lights.向后推(&light);}@user991673:如果
dir
本身是常量,则
dir
内部的
data
将自动保持常量,我相信这就是您的情况。@user991673:O该代码看起来有问题。您正在获取堆栈分配对象的地址,然后离开该对象存在的范围。尝试访问ss
light
在后面的某个阶段通过该指针是未定义的。
dir
不太可能是
const
。您需要查看
数据的声明位置。它是局部变量吗?是传递给函数的参数吗?是的,我对此不满意。如果我不希望m_lights向量的成员是const,如果给了我一个怎么办?我试过使用const_cast,但它从来没有正确地符合它。。。
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);