[gelöst] Vergleichsoperator für std::map mit std::string selbst definieren?
-
Hallo.
Möchte mir gerne einen Vergleichsoperator für folgende Ausprägung von std::map haben:std::map<std::string, LPDIRECT3DSURFACE9> m_Surfaces;Da der Schlüssel der Map-Einträge ein std::string ist, müsste er es doch eigentlich selber können, so dass ich keinen eigenen Operator definieren muss, oder? Oder vergleicht er immer das Paar?
inline bool operator < (const std::pair<std::string,LPDIRECT3DDEVICE9>& left, const std::pair<std::string,LPDIRECT3DDEVICE9>& right)Irgendwie klappt das alles nicht..
Wenn ich keinen Operator definiere, sagt er mir folgendes:1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)": template-Argument für "const std::_Tree<_Traits> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\xtree(1466): Siehe Deklaration von 'std::operator <'
1> c:\programme\microsoft visual studio 9.0\vc\include\functional(142): Bei der Kompilierung der Klassen-template der bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const-Memberfunktion
1> with
1> [
1> _Ty=std::string
1> ]
1> c:\programme\microsoft visual studio 9.0\vc\include\map(68): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::less<_Ty>".
1> with
1> [
1> _Ty=std::string
1> ]
1> c:\programme\microsoft visual studio 9.0\vc\include\xtree(22): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,_Mfl>".
1> with
1> [
1> _Kty=std::string,
1> _Ty=LPDIRECT3DSURFACE9 ,
1> _Pr=std::lessstd::string,
1> _Alloc=std::allocator<std::pair<const std::string,LPDIRECT3DSURFACE9 >>,
1> _Mfl=false
1> ]
1> c:\programme\microsoft visual studio 9.0\vc\include\xtree(63): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Tree_nod<_Traits>".
1> with
1> [
1> _Traits=std::_Tmap_traits<std::string,LPDIRECT3DSURFACE9 ,std::lessstd::string,std::allocator<std::pair<const std::string,LPDIRECT3DSURFACE9 >>,false>
1> ]
1> c:\programme\microsoft visual studio 9.0\vc\include\xtree(89): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Tree_ptr<_Traits>".
1> with
1> [
1> _Traits=std::_Tmap_traits<std::string,LPDIRECT3DSURFACE9 ,std::lessstd::string,std::allocator<std::pair<const std::string,LPDIRECT3DSURFACE9 >>,false>
1> ]
1> c:\programme\microsoft visual studio 9.0\vc\include\xtree(107): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Tree_val<_Traits>".
1> with
1> [
1> _Traits=std::_Tmap_traits<std::string,LPDIRECT3DSURFACE9 ,std::lessstd::string,std::allocator<std::pair<const std::string,LPDIRECT3DSURFACE9 >>,false>
1> ]
1> c:\programme\microsoft visual studio 9.0\vc\include\map(78): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Tree<_Traits>".
1> with
1> [
1> _Traits=std::_Tmap_traits<std::string,LPDIRECT3DSURFACE9 ,std::lessstd::string,std::allocator<std::pair<const std::string,LPDIRECT3DSURFACE9 >>,false>
1> ]
1> c:\projekte\2d-engine\2d-engine\renderer.h(52): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::map<_Kty,_Ty>".
1> with
1> [
1> _Kty=std::string,
1> _Ty=LPDIRECT3DSURFACE9
1> ]
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)": template-Argument für "const std::_Tree<_Traits> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\xtree(1466): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)": template-Argument für "const std::_Tree<_Traits> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\xtree(1466): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)": template-Argument für "const std::_Tree<_Traits> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\xtree(1466): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\xutility(2236): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\xutility(2236): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\xutility(2236): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\xutility(2236): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)": template-Argument für "const std::_Revranit<_RanIt,_Base> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\xutility(2046): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)": template-Argument für "const std::_Revranit<_RanIt,_Base> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\xutility(2046): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)": template-Argument für "const std::_Revranit<_RanIt,_Base> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\xutility(2046): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)": template-Argument für "const std::_Revranit<_RanIt,_Base> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\xutility(2046): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)": template-Argument für "const std::pair<_Ty1,_Ty2> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\utility(84): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)": template-Argument für "const std::pair<_Ty1,_Ty2> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\utility(84): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)": template-Argument für "const std::pair<_Ty1,_Ty2> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\utility(84): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2784: "bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)": template-Argument für "const std::pair<_Ty1,_Ty2> &" konnte nicht von "const std::string" hergeleitet werden.
1> c:\programme\microsoft visual studio 9.0\vc\include\utility(84): Siehe Deklaration von 'std::operator <'
1>c:\programme\microsoft visual studio 9.0\vc\include\functional(143) : error C2676: Binärer Operator '<': 'const std::string' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nichtFalls ich den Operator definiere mit
inline bool operator < (std::pair<std::string,LPDIRECT3DDEVICE9>& left, std::pair<std::string,LPDIRECT3DDEVICE9>& right) { return (left.first < right.first); }dann sagt er mir folgendes:
1>c:\projekte\2d-engine\2d-engine\renderer.cpp(121) : error C2678: Binärer Operator '<': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'std::string' akzeptiert (oder keine geeignete Konvertierung möglich)
1> c:\projekte\2d-engine\2d-engine\renderer.cpp(119): kann 'bool operator <(std::pair<_Ty1,_Ty2> &,std::pair<_Ty1,_Ty2> &)' sein
1> with
1> [
1> _Ty1=std::string,
1> _Ty2=LPDIRECT3DDEVICE9
1> ]
1> bei Anpassung der Argumentliste '(std::string, std::string)'Wo liegt mein Fehler?
MfG
Hundefutter
-
Den Fehler kann man ganz einfach reproduzieren

#include <map> int main() { std::map<std::string, int> map; map["hello"] = 3; return 0; }Fällt dir was auf im Bereich der includes?

Grüssli
-
#include <string>....
Dachte ich hätte es drin, weil ich ja schon Variablen vom Type std::string definieren konnte..
Danke!MfG
Hundefutter
-
Hundefutter schrieb:
Dachte ich hätte es drin, weil ich ja schon Variablen vom Type std::string definieren konnte..
Es kann sein, dass die Klasse
std::stringüber andere Header inkludiert wird. Aber um die volle Funktionalität zu nutzen, brauchst du den Header<string>.