Folgendes:
%Vor%gibt:
%Vor%Während der folgenden
%Vor%gibt
%Vor%Letzteres scheint so zu sein, dass map keine Referenz für den Schlüsselwert enthalten kann, da sie die Klasse manchmal instanziieren muss und eine Referenz ohne ein Objekt nicht instanziiert werden kann. Aber warum funktioniert der erste Fall nicht?
Es ist illegal, Referenzen in einem STL-Container zu speichern, da Typen kopierbar und zuweisbar sein müssen. Referenzen können nicht zugewiesen werden.
Genau welche Operation den ersten Fehler verursacht, hängt von der Implementierung ab, aber ich stelle fest, dass es sich auf das Erstellen einer Referenz bezieht und diese nicht sofort zugewiesen wird. Die zweite Fehlermeldung sieht so aus, als ob sie tatsächlich mit dem Erstellen des Kartenindex zusammenhängt.
Wenn Ihr Typ klein ist, können Sie ihn in die Map kopieren, oder wenn er groß ist, ziehen Sie stattdessen die Verwendung von Zeigern in Betracht, aber denken Sie daran, dass der Container die Objekte nicht für Sie freigibt, müssen Sie das explizit selbst tun.
Diese SO Frage könnte für dich von Interesse sein.
§8.3.2 Abschnitt 5
Es darf keine Verweise auf Referenzen, keine Arrays von Referenzen und keine Verweise auf Referenzen geben.
Sie denken wahrscheinlich an Referenzen als lustige Hinweise. Sie sind nicht.
Sie können keine Referenzen speichern, da sie nicht kopierbar sind (und einige Operationen sind unmöglich, weil sie auch nicht standardmäßig konstruierbar sind).
Sie können das Verhalten jedoch mit einem Zeiger emulieren:
%Vor%Es ist ein bisschen nervig, weil Sie dann zweimal dereferenzieren müssen:
%Vor% aber mit einem map
ist es viel weniger verwirrend als mit einem vector
oder set
(es wäre (*it)->foo()
.
Schließlich gibt es ein paar Fehler (die eines Zeigers):