std::tr1::unordered_map<CString,...> - compiler error



  • Hallo zusammen,

    wenn ich einen MFC CString als Key in einer std::tr1::unordered_map nutzen möchte kommt folgenden Kompiler-Fehler:

    d:\software-entwicklung\microsoft visual studio 9.0\vc\include\functional(1265) : error C2440: 'Typumwandlung': 'const CString' kann nicht in 'size_t' konvertiert werden
    Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden

    //functional:
    //...
    _STD_BEGIN
    	namespace tr1 {	// always include std::tr1::hash for unordered_map/set
    	// TEMPLATE CLASS hash
    template<class _Kty>
    	class hash
    		: public unary_function<_Kty, size_t>
    	{	// hash functor
    public:
    	size_t operator()(const _Kty& _Keyval) const
    		{	// hash _Keyval to size_t value by pseudorandomizing transform
    		ldiv_t _Qrem = ldiv((long)(size_t)_Keyval, 127773);  // <--- ERROR
    
    		_Qrem.rem = 16807 * _Qrem.rem - 2836 * _Qrem.quot;
    		if (_Qrem.rem < 0)
    			_Qrem.rem += 2147483647;
    		return ((size_t)_Qrem.rem);
    		}
        };
    //...
    

    Der Fehler tritt auf sobald ich auf die unordered_map mit dem operator[] mit einem CString oder Literal zugreifen möchte. Wenn ich nur über unordered_map::iterator zugreife kommt kein Fehler.

    Woran liegt es? Kann mir jemand weiter helfen?


  • Mod

    Der Standard hash geht eben nicht für CString.
    Du musst eine eigene std:hash Implementierung für CString angeben.



  • Lösung:

    1.) eigene hash<CString>-Spezialisierung schreiben (wie für std::[w]string bereits vorhanden ist)
    2.) CMap benutzen

    Sehe ich das richtig? 😕

    Edit: Danke Martin! 🙂


Anmelden zum Antworten