[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 nicht

    Falls 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


  • Administrator

    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> .


Anmelden zum Antworten