Const Discards Qualifers: C ++

Ik gebruik OpenGL om cameraperspectieven weer te geven, en een punt in mijn code probeer ik de richting van het licht te nemen (hier weergegeven als type "Vector4") en het te vermenigvuldigen met een matrix van het type "Matrix4x4" dat staat voor de Modelview-transformatie (sorry als dit geen zin heeft, dit is voor een schoolproject, dus ik ben nog steeds aan het leren over dit spul) Hoe dan ook, mijn code gaat als volgt ...

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

dit geeft me de volgende foutmelding:

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

Nogmaals, veel van deze code is vooraf geschreven voor de klasse (namelijk de vector- en matrixtypen) maar als iemenme gewoon zou kunnen helpen te ontcijferen wat de fout betekent, zou dat zeer gewaardeerd worden! Ik kan meer informatie geven als dat nodig is.

I figured 'data' or 'data->dir' were const, however I can find no mention of either of them to be. 'dir' is of type SceneLightData, enwhen its added on I'm doing this:

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

    m_lights.push_back(&light);
}

De fout doet zich voor op deze regel:

data->dir = lightDirection;

Bewerken

probleem opgelost. bedankt iedereen! oplossing:

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

    m_lights.push_back(light);
}

en

SceneLightData* data = m_lights[i];

data->dir = data->dir * follow->getModelviewMatrix().getInverse().getTranspose();         
setLight(*data);
1
Is Vector4 een typedef van const vec4 ?
toegevoegd de auteur Shahbaz, de bron
Oh wacht, krijg je deze foutmelding op de regel met data-> dir = lightDirection; ?
toegevoegd de auteur Shahbaz, de bron
Wat is het type gegevens ? Geef de verklaring van gegevens op, evenals de definitie van welk type het ook is (of de definitie van het type dat een verwijzing is naar).
toegevoegd de auteur Mankarse, de bron
light bestaat niet meer bij het verlaten van addLight , dus de aanwijzer die u aan m_lights heeft toegevoegd, is ongeldig bij het retourneren van functies. Doe m_lights.push_back (nieuwe SceneLightData (sceneLight)); en zorg ervoor dat deze wordt verwijderd wanneer verwijderd uit m_lights of wanneer Scene wordt vernietigd .
toegevoegd de auteur Mike DeSimone, de bron

2 antwoord

data->dir is constant. It means you cannot change it, and you are trying to assign a different value to it, that's why compiler is getting mad at you. See const-correctness for more.

1
toegevoegd
@ user991673: O_o Die code ziet er problematisch uit. U neemt het adres van een stack toegewezen object en laat vervolgens het bereik waarin dat object bestaat. Het resultaat van een poging tot toegang tot light via die aanwijzer in een later stadium is niet gedefinieerd.
toegevoegd de auteur Mankarse, de bron
Dat is wat ik dacht, maar ik kan geen melding maken van dir of data const. 'dir' als van het type SceneLightData, en wanneer het toegevoegd is, doe ik dit: void Scene :: addLight (const SceneLightData & sceneLight) {SceneLightData light = sceneLight; m_lights.push_back (en licht); }
toegevoegd de auteur romeboards, de bron
Ja, ik ben er niet blij mee. Als ik niet wil dat de leden van mijn m_lights-vector const zijn, wat moet ik dan doen als ik een vector heb gekregen? Ik heb gebruikt const_cast geprobeerd, maar het is nooit correct nageleefd ...
toegevoegd de auteur romeboards, de bron
loste het probleem op, controleer de originele post voor mijn reparatie (laat me alsjeblieft weten of het nog steeds vreselijke programmering is). Bedankt iedereen!
toegevoegd de auteur romeboards, de bron
Het is zeer onwaarschijnlijk dat dir const is. U moet kijken waar gegevens wordt aangegeven. Is het een lokale variabele? Een parameter doorgegeven aan de functie?
toegevoegd de auteur Mike DeSimone, de bron
U kunt nieuw altijd een niet-const-object maken en het initialiseren met een const -object: new SceneLightData (sceneLight)
toegevoegd de auteur Mike DeSimone, de bron
@ user991673: Uw dir binnen gegevens wordt automatisch constant als dir zelf constant is, wat naar mijn mening uw geval is.
toegevoegd de auteur user405725, de bron
const_cast werkt alleen op iets dat niet als const is gedeclareerd. Anders heb je ongedefinieerd gedrag. Om lid altijd niet-const te maken, kunt u het als mutable declareren. Anders - gewoon niet dat object als niet-constant in de eerste plaats. Als iemand je een constant object aan het doorgeven is, is het laatste wat ze verwachten dat dat object zal worden veranderd ... Dus heroverweeg je programma-ontwerp ..
toegevoegd de auteur user405725, de bron

This error occurs because you are attempting to call a non-const member function on a const object. At some point in your code you are calling the assignment operator of a const vec4.

De toewijzingsoperator ( operator = ) is niet-const omdat toewijzing aan een object het object dat wordt toegewezen, wijzigt (om het zijn nieuwe waarde te geven).

Het is niet duidelijk uit uw voorbeeld waar het probleem zich precies voordoet. Als je nog steeds problemen ondervindt, probeer dan het voorbeeld terug te brengen tot een minimaal compleet programma dat het probleem laat zien, en we kunnen het verder uitleggen.

0
toegevoegd