C ++ - Typ stimmt nicht überein: const Foo * to Foo * const &

8

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.

    
Balz Guenat 05.05.2015, 02:02
quelle

4 Antworten

7

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 *

zurück

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.

    
Corey 05.05.2015, 02:28
quelle
5

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.

    
Greg Hewgill 05.05.2015 02:05
quelle
3

Ich löste das Problem, indem ich den Typ der Menge wie folgt änderte.

%Vor%

Mit dieser Änderung ist die Kompilierung erfolgreich.

    
Balz Guenat 05.05.2015 02:13
quelle
3

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.

    
Carlton 05.05.2015 02:14
quelle

Tags und Links