C++ - Ungültige Argumente, die Kandidaten sind : ".." auf Setter aus verschiedenen Klassen
Immer eine seltsame Fehlermeldung, die ich nicht lösen konnte.
Habe ich paar Dateien, Store.cpp, Speichern.h (Klasse Store ist hier definiert), Order.cpp, Um.h (Klasse Bestellung ist hier definiert).
Store.cpp hat #include "Order.h"
.
Innerhalb der Klasse Order
ich habe ein paar setter und Getter im öffentlichen Bereich, ist einer von Ihnen :
void setStatus(const OrderStatus& orderStatus);
OrderStatus ist ein enum.
Wenn ich versuche, es zu benutzen Store.cpp mit der folgenden Zeile :
(*itr).setStatus(ORDER_DONE);
Ich bekomme diese Fehlermeldung von eclipse :
Ungültige Argumente' Kandidaten sind: void setStatus(const enum {order.h:140} &) '
Die Fehlermeldung vom GCC :
Speichern.cpp:250:31: Fehler: keine passende Funktion für Aufruf von âOrder::setStatus(OrderStatus) constâ Store.cpp:250:31: Anmerkung: Kandidat ist:
um.h:47:7: Anmerkung: void Auftrag::setStatus(const OrderStatus&)
um.h:47:7: Anmerkung: keine bekannte Umwandlung für impliziten âthisâ parameter aus âconst Um*â zu âOrder*â
Ich weiß wirklich nicht wo die const kamen aus (Linie 250).
- Ooops, sorry, ich meinte, Sie brauchen einen non-const iterator.
- Dies ist, was ich mit.. für(set<Der>::iterator itr = this->Bestellungen.begin() ; itr != dieser->Bestellungen.end() ; ++itr)
- Sets erlauben nur const-Zugriff, sonst könnte man es Total verhauen die Bestellung.
- Oh. Also, wie kann ich ändern, was zeigt es an ? Wenn es Punkte auf eine Bestellung, wie kann ich den inneren Bereichen Um, wie um.Preis ?
- Sie können entweder markieren Sie die Methode
const
(und die Daten-membermutable
), das scheint falsch, oderconst_cast
die Referenz, was scheint hässlich und fehleranfällig. Oder Sie könnenmap
stattset
, so können Sie mutieren, der Wert sicher. - Das können Sie nicht. Ein Satz ist die falsche datastructure für Ihr problem.
- Was du also sagst ist, dass der einzige Weg, auf diese Weise zu arbeiten ist, um es zu entfernen aus dem set, update-und insert wieder ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::set
wird verwendet für die Speicherung von unveränderlich Wert-Typen. Sie müssen unveränderlich sein, denn sonst können Sie brechen die Bestellung von Einschränkungen, wenn Sie mutieren, Sie.Wenn Sie möchten, verknüpfen eine veränderliche Wert mit einer Taste (die ist unveränderlich der gleiche Grund), verwenden Sie
std::map
statt.Mechanik es sind folgende:
funktioniert nicht, weil
*iter
ErträgeOrder const &
und Ihre Methode nicht const.Erwähnte ich in einem Kommentar zwei Möglichkeiten, um das problem zu vermeiden, aber Sie beide, so zu tun, um const-correctness, und ich empfehle nicht mit einer von Ihnen. Aber, der Vollständigkeit halber:
machen es zu kompilieren, als würde eine änderung der Reihenfolge der Klasse selbst:
Entweder dieser könnte auch brechen
std::set
's Bestell-invariant, falls der status in der Vergleich. Die erste version ist zu sagen "vertraut mir einfach" und weicht const-Korrektheit vollständig, während die zweite explizit kommuniziert, dass der status nicht einen "echten" Teil, der den Zustand des Objekts und nicht für die Sortierung verwendet werden.Ernst, verwenden Sie die richtigen Daten-Struktur statt.
transform
den Eingang in einen Ausgang setzen, obwohl.In der Reihenfolge ändern, Elemente einer
set
, müssen Sie entfernen Sie das element, um eine lokale Kopie, ändern Sie es dort, dann legen Sie es wieder in,set
s sind zerbrechlich und übernehmen Elemente ändern nicht Ihre Reihenfolge, während in den container, der ist, warum der Zugriff auf die Elemente istconst
.