Diese Menge von Objekten und Anweisungen:
%Vor%Ich bekomme den Fehler "keine bekannte Konvertierung für Argument 1 von 'const Foo *' nach 'Foo * const & amp;". Ich schätze, ich habe Schwierigkeiten, diese Typen zu lesen, weil ich keine Ahnung habe, was ich tun soll, damit dies funktioniert.
Nach dem, was ich gelesen habe, gilt das const-Schlüsselwort für den Typ auf der linken Seite mit Ausnahme einer Const der obersten Ebene, die links neben dem Typ geschrieben werden kann, für den es gilt. Meine Vermutung wäre, dass ich get () zu einer Referenz konvertieren muss, aber ich bin nicht sicher, wie das geht.
Es scheint hier ein paar Missverständnisse zu geben (sowohl vom Fragesteller als auch von einigen Antworten).
Zuerst sagten Sie: "Ich würde annehmen, dass ich get()
in eine Referenz konvertieren muss, aber ich bin mir nicht sicher, wie ich das machen soll." Lassen Sie uns versuchen, dies aufzuklären:
1) "Ich muss get()
in eine Referenz konvertieren" - Eigentlich nicht!
iterator QSet::insert(const T & value)
nimmt tatsächlich eine Referenz. Aber es ist ein Verweis auf T
. Die Frage ist also: "Was ist der Typ T
"?
In diesem Fall T=Foo *
. Also insert
, in dieser Instanz der Vorlage, ist eigentlich:
iterator QSet::insert(Foo * const & value)
- lese es von rechts nach links: insert
nimmt einen Verweis auf einen konstanten Zeiger auf ein Foo
.
2) "Ich bin mir nicht sicher, wie das geht [einen Zeiger auf eine Referenz konvertieren]" - obwohl Sie dies hier nicht tun müssen, tun Sie dies im Allgemeinen, indem Sie das Ergebnis von get aufheben. Zum Beispiel: *(get())
.
Second , der Compilerfehler. Der Fehler tritt auf, weil ein Konflikt vorliegt:
a) get()
gibt const Foo *
b) aber set
speichert eine Foo*
- NICHT eine const Foo *
, also akzeptiert insert
nur eine änderbare Foo
Sie können also keinen konstanten Zeiger in Ihrem QSet<Foo*>
speichern. Dies ist sinnvoll, weil Sie set
verwenden können, um auf das Foo
s zuzugreifen und es zu ändern, was Sie mit einem const Foo
nicht versprechen.
Diese Referenz sollte hilfreich sein:
Sie können auch denken, ob Sie einfach QSet<Foo>
anstelle von QSet<Foo*>
verwenden können. Im ersten Fall werden sich die Dinge wahrscheinlich so verhalten, wie Sie es erwarten.
Sie versuchen, ein const Foo *
zu nehmen und es in ein QSet<Foo *>
einzufügen, aber der Compiler konvertiert nicht automatisch ein const Foo *
in ein einfaches Foo *
, um dies zu tun.
Ich löste das Problem, indem ich den Typ der Menge wie folgt änderte.
%Vor%Mit dieser Änderung ist die Kompilierung erfolgreich.
Sie verletzen die Konstanz des von der Funktion get()
zurückgegebenen Zeigers. get()
gibt einen Zeiger auf ein const-Objekt vom Typ Foo
zurück, aber Sie versuchen dann, es in einen Vektor nicht-const Foo
-Zeiger einzufügen. Sie müssen const_cast
den Rückgabewert von get()
eingeben oder den Rückgabetyp von get()
von const Foo*
auf nur Foo*
ändern.