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?
-
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 benutzenSehe ich das richtig?
Edit: Danke Martin!