unordered_map und std::string



  • Hi,

    ich habe folgendes Problem:

    #include "unordered_map"
    class SymbolInterpreter
    {
    std::unordered_map<std::string, Symbol> m_hash;
    };
    

    liefert bei mir einen Compiler-Error.
    Und zwar:

    C:\Meine-Programme\Visual C++\VC\include\xfunctional(92): error C2678: Binärer Operator '==': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const std::string' akzeptiert (oder keine geeignete Konvertierung möglich)
    1>          C:\Meine-Programme\Visual C++\VC\include\exception(470): kann 'bool std::operator ==(const std::_Exception_ptr &,const std::_Exception_ptr &)' sein
    1>          C:\Meine-Programme\Visual C++\VC\include\exception(475): oder "bool std::operator ==(std::_Null_type,const std::_Exception_ptr &)"
    1>          C:\Meine-Programme\Visual C++\VC\include\exception(481): oder "bool std::operator ==(const std::_Exception_ptr &,std::_Null_type)"
    1>          C:\Meine-Programme\Visual C++\VC\include\system_error(408): oder "bool std::operator ==(const std::error_code &,const std::error_condition &)"
    1>          C:\Meine-Programme\Visual C++\VC\include\system_error(416): oder "bool std::operator ==(const std::error_condition &,const std::error_code &)"
    1>          bei Anpassung der Argumentliste '(const std::string, const std::string)'
    1>          C:\Meine-Programme\Visual C++\VC\include\xfunctional(91): Bei der Kompilierung der  Klassen-template der bool std::equal_to<_Ty>::operator ()(const _Ty &,const _Ty &) const-Memberfunktion
    1>          with
    1>          [
    1>              _Ty=std::string
    1>          ]
    1>          C:\Meine-Programme\Visual C++\VC\include\xhash(163): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::equal_to<_Ty>".
    1>          with
    1>          [
    1>              _Ty=std::string
    1>          ]
    1>          C:\Meine-Programme\Visual C++\VC\include\unordered_map(73): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Hash_compare<_Kty,_Hasher,_Keyeq>".
    1>          with
    1>          [
    1>              _Kty=std::string,
    1>              _Hasher=std::hash<std::string>,
    1>              _Keyeq=std::equal_to<std::string>
    1>          ]
    1>          C:\Meine-Programme\Visual C++\VC\include\xhash(170): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::tr1::_Umap_traits<_Kty,_Ty,_Tr,_Alloc,_Mfl>".
    1>          with
    1>          [
    1>              _Kty=std::string,
    1>              _Ty=Symbol,
    1>              _Tr=std::_Hash_compare<std::string,std::hash<std::string>,std::equal_to<std::string>>,
    1>              _Alloc=std::allocator<std::pair<const std::string,Symbol>>,
    1>              _Mfl=false
    1>          ]
    1>          C:\Meine-Programme\Visual C++\VC\include\unordered_map(85): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Hash<_Traits>".
    1>          with
    1>          [
    1>              _Traits=std::tr1::_Umap_traits<std::string,Symbol,std::_Hash_compare<std::string,std::hash<std::string>,std::equal_to<std::string>>,std::allocator<std::pair<const std::string,Symbol>>,false>
    1>          ]
    1>          c:\meine-programme\projektdateien\projekte_vc\Parser\Symbol.h(53): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::tr1::unordered_map<_Kty,_Ty>".
    1>          with
    1>          [
    1>              _Kty=std::string,
    1>              _Ty=Symbol
    1>          ]
    

    Es sieht für mich so aus, als ob halt der '==' Operator für std::string zu viele
    Möglichkeiten bereitstellt.

    Wie umgehe ich das am besten?

    Mfg.



  • Nein es ist gar keiner definiert, weil Du den <string> Header nicht inkludiert hast.



  • Ouch, ärgerlich.
    Wieso er sich allerdings nicht stattdessen über "unknown-type: string" beschwert - kA.

    Nuja, danke.



  • Weil der Typ std::string über die inkludierten Header bekannt ist.


  • Mod

    Mathews schrieb:

    Ouch, ärgerlich.
    Wieso er sich allerdings nicht stattdessen über "unknown-type: string" beschwert - kA.

    Nuja, danke.

    Kann ja gut sein, dass der Typ string bekannt ist. unordered_map.h wird sicherlich irgendwelche Standardheader einbinden. Der Standard verbietet nicht, dass in einem Header nicht auch Klassen und Funktionen aus einem anderen Header bekannt gemacht werden. Hier wurde anscheinend irgendwo string deklariert, aber nicht der Vergleichsoperator dazu.


Anmelden zum Antworten