Benutzerdefinierte Typen als Schlüssel für eine Karte - C ++
Ich versuche weisen Sie einen benutzerdefinierten Typ als Schlüssel für std::map. Hier ist die Art, die ich benutze als Schlüssel.
struct Foo
{
Foo(std::string s) : foo_value(s){}
bool operator<(const Foo& foo1) { return foo_value < foo1.foo_value; }
bool operator>(const Foo& foo1) { return foo_value > foo1.foo_value; }
std::string foo_value;
};
Wenn verwendet mit std::mapich erhalte die folgende Fehlermeldung.
error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const Foo' (or there is no acceptable conversion) c:\program files\microsoft visual studio 8\vc\include\functional 143
Wenn ich die Struktur wie die unten, hat alles geklappt.
struct Foo
{
Foo(std::string s) : foo_value(s) {}
friend bool operator<(const Foo& foo,const Foo& foo1) { return foo.foo_value < foo1.foo_value; }
friend bool operator>(const Foo& foo,const Foo& foo1) { return foo.foo_value > foo1.foo_value; }
std::string foo_value;
};
Nichts geändert, außer die Herstellung der operator-überladungen als Freund. Ich Frage mich, warum meine erste code nicht funktioniert?
Irgendwelche Gedanken?
InformationsquelleAutor der Frage Navaneeth K N | 2009-05-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, Sie müssen
Hinweis: die
const
nach die Argumente, das ist zu machen "Ihr" (der linken Seite in den Vergleich mit ein) Objekt konstant.Grunde nur ein Bediener benötigt wird, ist, dass es ist genug für die Durchführung der Bestellung erforderlich. Die Antwort auf die abstrakte Frage "gibt es ein kommen vor b?" es ist genug, um zu wissen, ob a kleiner als b ist.
InformationsquelleAutor der Antwort unwind
Es ist wahrscheinlich auf der Suche für const-member-Operatoren (wie auch immer der korrekte name ist).
Das funktioniert (Hinweis const):
EDIT: gelöscht
operator>
aus meiner Antwort, da es nicht notwendig war (copy/paste aus der Frage), aber es war die Anziehung Kommentare 🙂Hinweis: ich bin mir 100% sicher, dass Sie brauchen, constweil ich die kompilierte Beispiel.
InformationsquelleAutor der Antwort stefanB
Hinweis: das const nach dem Argumente, das ist zu machen "Ihr" (der linken Seite in den Vergleich mit ein) Objekt konstant.
Könnten Sie das bitte etwas näher erläutern? Warum, wenn Sie dem Mitglied const (was soweit ich weiß bedeutet, dass es nicht ändern können Objekt-Zustand - z.B. ändern private Variablen), die garantiert, dass "Ihre" wird die linke Seite?
InformationsquelleAutor der Antwort Tsvetomir Dimitrov
Hab ich noch nicht die rep zu kommentieren.
const nicht auf Magische Weise sicherstellen, dass "Ihr" wird der linken Seite. Das Plakat sagte, dass die linke Seite (D. H. x in x < y) ist das Objekt, auf dem der Vergleich aufgerufen wird. Nur so schützen Sie die y-Mitglieder aus ändern mit der const-auf das argument operator<, Sie auch schützen wollen x die Mitglieder durch Veränderung, die mit der const am Ende der Methodensignatur.
InformationsquelleAutor der Antwort dpwrussell