Const отбрасывает отборочные: C ++ - PullRequest
1 голос
/ 12 ноября 2011

Я использую OpenGL для рендеринга перспективы камеры, и одна точка в моем коде, я пытаюсь взять направление света (показано здесь как тип "Vector4") и умножить его на матрицу типа "Matrix4x4«Это представляет преобразование Modelview (извините, если это не имеет никакого смысла, это для школьного проекта, поэтому я все еще изучаю этот материал) В любом случае, мой код выглядит следующим образом ...

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» были постоянными, однако я не могу найти упоминания ни об одном из них.'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);

Ответы [ 2 ]

1 голос
/ 12 ноября 2011

data->dir постоянно. Это означает, что вы не можете изменить его, и вы пытаетесь присвоить ему другое значение, поэтому компилятор злится на вас. Подробнее см. const-правильность .

0 голосов
/ 12 ноября 2011

Эта ошибка возникает из-за того, что вы пытаетесь вызвать неконстантную функцию-член для константного объекта.В какой-то момент в вашем коде вы вызываете оператор присваивания const vec4<double>.

Оператор присваивания (operator=) неконстантен, потому что присвоение объекту изменит объект, который назначается(чтобы придать ему новое значение).

Из вашего примера неясно, где именно возникает проблема.Если у вас все еще возникают проблемы, попробуйте сократить пример до минимально полной программы, которая демонстрирует проблему, и мы можем объяснить ее подробнее.

...