2011-11-12 157 views
1

我使用OpenGL渲染相機視角,並在我的代碼中的一個點我試圖採取光的方向(這裏顯示爲類型「Vector4」),並乘以一個代表Modelview轉換的Matrix4x4類型的矩陣(對不起,如果這沒有任何意義,這是針對學校項目的,因爲我仍然在學習這個東西)。無論如何,我的代碼如下所示...Const丟棄Qualifers:C++

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 

再次,多日的代碼是爲類預先編寫的(即向量和矩陣類型),但如果有人可以幫助我解讀錯誤意味着什麼,將不勝感激!我可以根據需要提供更多信息。

我認爲'數據'或'數據 - >目錄'是常量,但是我找不到它們中的任何一個。 '目錄' 的類型是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); 
+0

'Vector4'是'const vec4 '的'typedef'嗎? – Shahbaz

+0

哦,等一下,你會看到'data-> dir = lightDirection;'這行的錯誤。 – Shahbaz

+0

退出'addLight'時'light'不再存在,所以添加到'm_lights'的指針在函數返回時將無效。你應該做'm_lights.push_back(new SceneLightData(sceneLight));'並且確保從'm_lights'中移除或者'Scene'破壞時它被刪除。 –

回答

1

data->dir是恆定的。這意味着你不能改變它,並且你正試圖爲它分配一個不同的值,這就是編譯器爲什麼會對你生氣的原因。有關更多信息,請參閱const-correctness

+0

多數民衆贊成我認爲,但是我可以找到沒有提到要麼是目錄或數據是const。'dir'如果類型爲SceneLightData,並且當它添加時,我正在執行此操作: void Scene :: addLight(const SceneLightData&sceneLight) { SceneLightData light = sceneLight; m_lights.push_back(&light); } – romeboards

+0

@ user991673:如果'dir'本身是恆定的,那麼'data'中的'dir'將自動保持不變,我相信這是您的情況。 – 2011-11-12 01:34:37

+1

@ user991673:O_o該代碼看起來有問題。您正在獲取堆棧分配對象的地址,然後離開該對象所在的範圍。嘗試在稍後階段嘗試通過該指針訪問「light」的結果是未定義的。 – Mankarse

0

發生此錯誤是因爲您試圖在常量對象上調用非const成員函數。在代碼中的某個時刻,您正在調用const vec4<double>的賦值運算符。

賦值運算符(operator=)是非常量,因爲分配給對象將修改正在分配給的對象(以賦予其新值)。

從您的示例中不清楚發生問題的確切位置。如果您仍然遇到麻煩,請嘗試將示例縮減爲一個可以證明問題的最小完整程序,並且我們可以進一步解釋。

相關問題