Will mich Visual Studio verarschen?



  • Hallo!
    Ich glaube, ich sehe nicht recht:

    // Headerdatei wird anderswo inkludiert, map und string vorhanden
    #ifndef IOLEXER_HPP
    #define IOLEXER_HPP
    
    namespace Lexer {
    
    	class IOLexer {
    
    	private:
    		std::string command;
    		std::map<std::string, int> cmds;
    
    	public:
    		IOLexer();
    		void RunCommand(std::string &s) const;
    
    	};
    
    }
    
    #endif
    
    #include "Main.hpp"
    
    using namespace Lexer;
    using namespace std;
    
    IOLexer::IOLexer() {
    	cmds["/help"] = 4;
    }
    
    void IOLexer::RunCommand(std::string &s) const {
    cout << cmds["/help"] << endl; // Zack!!!!!!!!!!!!!!!!!!!
    }
    
    void IOLexer::Help() {
    	cout << "Hilfe!" << endl;
    }
    

    Fehler:

    Binärer Operator '[': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const std::map<_Kty,_Ty>' akzeptiert (oder keine geeignete Konvertierung möglich)
    

    Wenn ich den cout im Konstruktor aufrufe, gehts?! Was soll der Mist?



  • der Fehler steht da 🙂
    man beachte das const hiunter dem Funktionsnamen RunCommand.
    d.h. du darfst in dieser Funktion keine Variablen verändern (weißt du sicher, sonst hättestes ncih geschrieben).

    Leider ist der op[] von map nicht const -> er kann nicht aufgerufen werden. Er ist nicht const, da das Element angelegt wird, falls es noch nicht existiert.

    Für deine Sache müsstest du am besten mit map.find() arbeiten.



  • OmgGG schrieb:

    void RunCommand(std::string &s) const;
    

    Wenn du eine Member-Funktion als const deklariest, wird auch der Zugriff auf die Klassen-Variablen als const stattfinden, d. h. innerhalb dieser Funktion hat deine Map den Typ const std::map<std::string, int> cmds; . Der map -Container definiert den indizierten Zugriff über [] aber nur auf für nicht-konstante Typen, da du mit diesem Operator eine Referenz auf den Wert bekommst und ihn damit ändern könntest (ist aber nicht erlaubt, wenn die Instanz konstant sein soll).

    Oder um's kurz zu fassen: für den indizierten Zugriff auf konstante Instanzen einfach std::map::find verwenden. 😃

    Edit: Uups... std::map::at scheint noch nicht offiziell zu sein.

    // DR 464. Suggestion for new member functions in standard containers.
    


  • Hehe, darauf wäre ich nie gekommen. Schade, dass operator[]() von map nicht const ist. :=) Ihr rettet meinen Abend, danke!



  • OmgGG schrieb:

    Hehe, darauf wäre ich nie gekommen. Schade, dass operator[]() von map nicht const ist. :=) Ihr rettet meinen Abend, danke!

    nimm map::find()
    op[] fügt den wert ein, wenn er nicht existiert - deshalb ist er auch nich const...

    bb



  • unskilled schrieb:

    op[] fügt den wert ein, wenn er nicht existiert

    Genau deswegen mache ich da einen grossen Bogen drum und benutze immer das hier schon mehrfach empfohlene map::find().


Anmelden zum Antworten