Fehlermeldung MS Visual Studio bei Ausgabe eines String-Values einer map



  • Hallo zusammen,
    ich bin neu hier und ebenfalls ein Anfänger in C++. Ich hoffe, dass ich hier ins richtige Unterforum poste.

    Ich bekomme bei folgendem Code:

    for (map<int, string>::const_iterator it = m.begin(); it != m.end(); ++it) {
    		cout << it->first << ' ' << it->second << endl;
    

    bei dem zweitletzten "<<" einen Fehler angezeigt und der Code kompiliert nicht.
    Laut VS kennt er keinen "<<"-Operator, der einen Operanden vom Typ "const std::string" akzeptiert (Fehlercode C2679). Dabei steht der Code so 1 zu 1 in meinem Skript. Kann es sein, dass ich etwas übersehe oder bei mir in VS verstellt habe?

    MfG

    uncle bens



  • Da der Code so korrekt ist (unter der Annahme von using namespace std), muss der Fehler anderswo sein. Die vollständige Fehlermeldung wäre hilfreich, NICHT eine Beschreibung, was der Fehler aussagt.



  • Ist

    #include <string>
    

    vorhanden?



  • OMG es lag wirklich an daran, dass ich #include <string> vergessen habe 🙄

    vielen Dank für eure Hilfe und sorry für die blöde Frage ^^

    Gruß

    uncle bens



  • Ich hätte aber bezüglich einer map über die man mit einem Iterator oder Const-Iterator läuft nochmal ein paar Fragen:

    for (auto it = m.cbegin(); it != m.cend(); ++it) {
    

    das scheint ja zu gehen und wenn ich cbegin() und cend() verwende, so wird it zu einem Const-Iterator. Wenn ich stattdessen m.begin() und m.end() verwende, so wird it zu einem Nicht-Const-Iterator, richtig?

    for (const auto it = m.cbegin(); it != m.cend(); ++it) {
    

    das wiederum funktioniert jetzt nicht. Macht nun das const den Const-Iterator konstant?



  • uncle bens schrieb:

    for (const auto it = m.cbegin(); it != m.cend(); ++it) {
    

    das wiederum funktioniert jetzt nicht. Macht nun das const den Const-Iterator konstant?

    Die Anweisung ++it verändert wie Variable "it", was für eine Konstante natürlich nicht erlaubt ist.

    Du könntest aber auch range-based-for verenden:

    for (const auto& p : m)
      cout << p.first << " " << p.second << "\n";
    


  • ok, dann scheine ich den zweiten Codeteil richtig verstanden zu haben. Ist halt nur etwas komisch einen konstanten Const-Iterator zu haben.

    Die neue for-Schleife mit const-Referenz werde ich wohl auch zukünftig überwiegend verwenden. Möchte nur die Funktion von auto in Verbindung mit Iteratoren mal grundlegend verstanden haben 🙂