Ich habe eine Funktion mit einer Signatur
void Foo(list<const A*>)
und ich möchte ihm eine
list<A*>
Wie kann ich das tun? (Bitte beachten Sie - die Liste ist nicht konstant, nur das Mitglied der Liste)
Ich habe eine Funktion mit einer Signatur
void Foo(list<const A*>)
und ich möchte ihm eine
list<A*>
Wie kann ich das tun? (Bitte beachten Sie - die Liste ist nicht konstant, nur das Mitglied der Liste)
Das Problem, das Sie haben, ist, dass, obwohl T *
kann implizit in eine T const *
Das Vorlagensystem ist sich dessen nicht "bewusst", so dass eine whatever<T *>
y whatever<T const *>
sind völlig unterschiedliche Typen, und es gibt keine implizite Konvertierung von einem zum anderen.
Um das Problem zu vermeiden, würde ich es wahrscheinlich vermeiden, überhaupt eine Sammlung zu übergeben. Stattdessen würde ich der Funktion ein Paar von Iteratoren übergeben. A list<A *>::iterator
puede stillschweigend in eine list<A *>::const_iterator
. Aus diesem Grund würde ich die Funktion wahrscheinlich zu einer Vorlage machen, damit sie Iteratoren beliebigen Typs annehmen kann.
Dies wird Ihnen wahrscheinlich eine Menge Ärger ersparen - eine list
ist nur selten eine gute Wahl für einen Container, so dass die Wahrscheinlichkeit sehr groß ist, dass Sie eines Tages von list<A *>
a vector<A *>
oder vielleicht deque<A *>
-- und wenn Sie Ihre Funktion generisch machen, können Sie das tun, ohne die Funktion überhaupt neu zu schreiben.
Sie können einfach eine neue Liste erstellen und diese mit den Werten aus Ihrer ursprünglichen Liste füllen. Das ist vielleicht nicht die effizienteste Lösung, was die Laufzeit- und Speicherverwaltung betrifft, aber sicherlich einfach zu programmieren:
list<A*> list1;
list<const A*> list2;
for(list<A*>::iterator a=list1.begin(); a!=list1.end(); a++) list2.push_back(*a);
Sie müssen eine Kopie der Liste erstellen - es ist ein pass-by-value-Argument. Es gibt eine recht einfache Möglichkeit, eine Kopie zu erstellen, da die Elementtypen eine implizite Konvertierung haben: Alle STL-Container können aus einem Paar von Iteratoren erstellt werden. Also, in Ihrem Fall:
std::list<A*> src;
Foo(std::list<const A*>(src.begin(), src.end()));
Dies ist etwas schwieriger, als es sein müsste, da die STL Bereiche als Paare von Iteratoren darstellt und die C++-Konvertierungsregeln mit einzelnen Objekten arbeiten.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.