Wie zu verwenden struct als Schlüssel für std::map
Ich möchte an einem std::map
deren Schlüssel-Wert-Elemente-Strukturen.
Bekomme ich die folgende Fehlermeldung:
error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'const GUID
Ich verstehe, dass ich, sollte überlastung operator <
für diesen Fall, aber die Sache ist ich habe keinen Zugriff auf den code der die Struktur, die ich verwenden möchten (GUID
Struktur in VC++).
Hier ist der Codeausschnitt:
//.h
#include <map>
using namespace std;
map<GUID,GUID> mapGUID;
//.cpp
GUID tempObj1, tempObj2;
mapGUID.insert( pair<GUID,GUID>(tempObj1, tempObj2) );
Wie dieses problem zu lösen?
InformationsquelleAutor dragan.stepanovic | 2011-03-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definieren Sie den Vergleichsoperator als freistehende Funktion:
Oder, da im Allgemeinen eine < operator macht nicht viel Sinn für GUIDs, könnten Sie stattdessen eine benutzerdefinierte Vergleich Funktor wie das Dritte argument der
std::map
Vorlage:operator<
Funktion Aussehen solltebool operator<(GUID& left, GUID& right)
; Auch nach dieser bekomme ich compilererror C2804: binary 'operator <' has too many parameters
. Ich verstehe nicht, warum, verursachen diese Funktion ist nicht in meiner Klasse, die maps?Ich denke, dass @Matteo wollte sagen
bool operator()(const std::pair<GUID, GUID> & Left, const std::pair<GUID, GUID> & Right)
Die richtige Antwort ist
bool operator()(const GUID &left, const GUID &right) const
Ops, bekam ich ein bisschen Durcheinander mit der zweiten; sorry, jetzt sollte es behoben sein. :S
Muss noch
operator()
. Bitte korrigieren Sie so, dass die Menschen auf der Suche für das gleiche problem hätte eine komplette Lösung. Grazie Matteo.InformationsquelleAutor Matteo Italia
Jede Art, die Sie als einen Schlüssel, um eine strenge schwache bestellen. Sie können eine Komparator-Typ als Dritten template-argument, oder Sie können überlastung
operator<
für Ihren Typ.operator<
wahrscheinlich nicht um streng genug. Mir nicht, bis ich erfuhr, dass dieser Begriff an anderer Stelle.InformationsquelleAutor Jerry Coffin
Gibt es keinen operator < für GUIDS, so dass Sie entweder zu haben, um den Vergleichsoperator oder eine andere Taste.
InformationsquelleAutor Ralf
Kann über die Klasse erbt von GUID in die Sie implementieren operator < wäre ein workaround für Sie?
InformationsquelleAutor Eugene Burtsev