[Qt] QString in std::unordered_map
-
Hallo,
ich möchte eine eine std::unordered_map<QString, MyClass*> erstellen, allerdings bekomme ich die Fehlermeldung "'type cast': cannot convert from 'const QString' to 'size_t'". Der Fehler selbst tritt in "C:\Program Files\Microsoft Visual Studio 10.0\VC\INCLUDE\xfunctional", Zeile 768 auf.
Das seltsame ist, dass alles funktioniert, wenn ich QString durch std::string ersetze.Hier ein Minimalbeispiel, das bei mir den besagten Fehler auslöst:
#include <QtCore> #include <unordered_map> class MyClass { public: bool is(MyClass* type) const { return parents.find(type->name()) != parents.end(); // Fehler } const QString& name() const { return typeName; } private: std::unordered_map<QString, MyClass*> parents; QString typeName; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); return a.exec(); }
Ich hoffe jemand weiß Rat.
Danke schonmal im Voraus,
Cute
-
Hier mit GCC-4.4.3 geht das (fast) problemlos.
unordered_map gibt es nicht im aktuellen Standard. Der kommt erst mit C++0x. Also Compiler entsprechend einstellen, oder tr1/unordered_map einbinden, dann geht es _absolut_ problemlos.
-
Ich verwende MS Visual Studio 10 und dort ist es zumindest laut MSDN ausreichend, wenn man einfach nur <unordered_map> einbindet. <tr1/unordered_map> findet der Compiler schon gar nicht mehr.
Das Problem scheint auch bei der Klasse std::hash zu liegen. Die erstellt anscheinend irgendwelche Hash-Werte, was aber anscheinend für QString nicht funktionert. Ist das ein Bug?
Ich kann das Problem beheben, wenn ich eine Spezialisierung für std::hash<QString> schreibe, also:#include <QtCore> #include <unordered_map> namespace std { template<> struct hash<QString> : public unary_function<QString, size_t> { size_t operator()(QString _Val) const { // Hier muss irgendein Hash-Wert generiert werden // return 0; nur als Dummy return 0; } }; } class MyClass { public: bool is(MyClass* type) const { return parents.find(type->name()) != parents.end(); } const QString& name() const { return typeName; } private: std::unordered_map<QString, MyClass*> parents; QString typeName; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); return a.exec(); }
Aber das kann ja wohl kaum Sinn der Sache sein.
Vielleicht nehme ich doch einfach std::map - damit funktioniert es nämlich anstandlos.Gruß,
Cute
-
Darf man fragen wozu du das brauchst? Qt hat doch QHash.
-
Qt hat doch QHash.
Ja, habe ich auch gerade gefunden.
Ich brauche halt nur ein assoziatives Array, wobei von QString auf einen Zeiger meiner Klasse gemappt werden soll.Ich beschäftige mich noch nicht so lange mit Qt, aber es scheint so, als würde man beim Entwickeln mit Qt kaum auf die C++ Standardbibliothek zurückgreifen.
Ist das normal?Gruß,
Cute
-
Cute schrieb:
Ich beschäftige mich noch nicht so lange mit Qt, aber es scheint so, als würde man beim Entwickeln mit Qt kaum auf die C++ Standardbibliothek zurückgreifen.
Ist das normal?für die meisten STL-Container hat Qt eigene Implementierungen, die auch gut mit den Qt-Typen zusammenarbeiten
man kann zwar trotzdem die stl-Container verwenden, weil auf eine Kompatibilität geachtet wurde, aber je nach Qt-Version kann es mit dem neuen C++-Standard Probleme geben. Sobald sich Qt als C++0x-kompatibel bezeichnet, dürfte die unordered_map keine Probleme mehr machen
Bis dahin gibts QHash<Key, Value>