cannot convert 'this' pointer from 'const TestClass' to 'TestClass &'



  • Hi!

    Ich habe gerade ein VS2008 Projekt nach VS2010 konvertiert, und plötzlich bekomme ich solche Fehler.

    Habe mal ein Minimalbeispiel erstellt und blicke irgendwie nicht dahinter, was der Compiler will. Er scheint von einem konstanten Objekt auszugehen, aber ich benutze keinen const_iterator... ?!

    class TestClass
    {
    	int x;
    public:
    	TestClass(int x)
    	{
    		;
    	}
    
    	bool operator<(const TestClass& testClass) const
    	{
    		return x < testClass.x;
    	}
    
    	void SetFunc()
    	{
    		x = 3;
    	}
    };
    
    std::set<TestClass> testSet;
    
    int main()
    {
    	std::set<TestClass>::iterator it = testSet.find(0);
    
    	it->SetFunc(); // Error: the object has type qualifiers that are not compatible with the member function
    }
    

    Was ist da los?



  • War ja klar, vorher schnell gegoogled, nix gefunden. Jetzt find ich das:

    http://blogs.msdn.com/b/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx (Problem 3: error C2662)

    Scheint so, als wäre jetzt iterator auch ein const_iterator 🙄

    Ich komme mit den Lösungsvorschlägen nicht klar, mutable auf x funktioniert nicht, const_cast wo anwenden? Und den Rest kapier ich nicht, ich möchte keine map verwenden und möglichst wenig am Code ändern.

    (Ich muss dazu sagen, dass x sowieso nur im Konstruktor gesetzt würde, SetFunc() ist also Blödsinn, aber auch mit y = 3 gehts nicht)

    😕



  • Wenn du den Wert so setzen könntest, wäre die Sortierung doch nicht mehr gegeben. Wenn du den Wert so setzen möchtest, ist std::set vielleicht nicht der richtige Container.



  • Ne möcht ich eh nicht. Wird, wie gesagt, eh nur im Konstruktor gesetzt. Beispiel war bisschen falsch. Aber trotzdem kommt der Fehler noch, auch wenn ich x nicht mehr verändern will.

    Wie könnte ich den Code mit möglichst wenig Aufwand fixen?



  • wtfvs2010 schrieb:

    Wie könnte ich den Code mit möglichst wenig Aufwand fixen?

    Da x die Sortierung ändert, darfst Du x eh nicht ändern.
    Also mußt Du ein neues Objekt anlegen mit neuem x und das in den Baum reinmachen und das alte rausmachen.
    Und dann hat der Compiler auch kein Problem mehr damit.

    Willste x gar nicht ändern, reicht

    void ShowFunc() const //<- hier const
        { 
            cout<< x << '\n'; 
        }
    


  • wtfvs2010 schrieb:

    Ne möcht ich eh nicht. Wird, wie gesagt, eh nur im Konstruktor gesetzt. Beispiel war bisschen falsch. Aber trotzdem kommt der Fehler noch, auch wenn ich x nicht mehr verändern will.

    Wie könnte ich den Code mit möglichst wenig Aufwand fixen?

    Du darfst nur const-Memberfunktionen aufrufen. Wenn du sowieso nichts ändern willst, sollte das kein Problem sein.



  • Ist leider doch ein Problem. Die Klasse hat auch Methoden, die andere Member ändern. Die kann ich auch nicht aufrufen... auch wenn der Key (x) nicht angefasst wird.

    Gibts keinen schnellen Workaround? Der Code soll einfach nur funktionieren, wie in VS2008, möchte daran echt nix großartig ändern.



  • wtfvs2010 schrieb:

    Ist leider doch ein Problem. Die Klasse hat auch Methoden, die andere Member ändern. Die kann ich auch nicht aufrufen... auch wenn der Key (x) nicht angefasst wird.

    Gibts keinen schnellen Workaround? Der Code soll einfach nur funktionieren, wie in VS2008, möchte daran echt nix großartig ändern.

    Dann kannste die anderen Member mutable machen und alle nötigen Funktionen const.

    Oder Du rufst

    const_cast<TestClass>(*it).SetFunc();
    

    auf und darfst dann halt nix aufrufen, was x verändert, sonst wäre der Baum danach verwirrt.



  • Ah jo, danke. Konnte ned testen da @Steam.


Anmelden zum Antworten