Dereferenzierung von map-Iterator kompiliert nicht
-
Hi,
ich habe lange versucht das zu reproduzieren, aber ich schaffe es einfach nicht, jedenfalls nicht mit einer lokalen Klasse. Vielleicht hat jemand Hinweise für mich.
Also der nicht-kompilierende Code ist:
auto it = HandStrengthNames::names.begin(); *it; // Fehler hier?! Fehlermeldung siehe ganz unten im PostHandStrengthNames ist so definiert:
struct HandStrengthNames { struct GreaterCountOfBits { bool operator()(const HandStrengthKey& lhs, const HandStrengthKey& rhs) const; }; typedef std::map<HandStrengthKey, std::string, GreaterCountOfBits> HandStrengthNamesMapping; typedef HandStrengthNamesMapping::value_type ConstMappedHandStrength; static HandStrengthNamesMapping initialize(); static HandStrengthNamesMapping names; };In der cpp-Datei steht dann:
HandStrengthNames::HandStrengthNamesMapping HandStrengthNames::names = HandStrengthNames::initialize();Okay und HandStrengthKey sieht dann noch so aus:
struct DLL_SPECIFIER /* dllim/export */ HandStrengthKey { HandStrengthDetailType handStrengthDetail; HandStrengthDetailType exclusiveHandStrengths; std::string customLabel; HandStrengthKey(const HandStrengthDetailType& handStrengthDetail, const HandStrengthDetailType& exclusiveHandStrengths) : handStrengthDetail(handStrengthDetail), exclusiveHandStrengths(exclusiveHandStrengths) {} HandStrengthKey(const HandStrengthDetailType& handStrengthDetail, const HandStrengthDetailType& exclusiveHandStrengths, const std::string& customLabel) : handStrengthDetail(handStrengthDetail), exclusiveHandStrengths(exclusiveHandStrengths), customLabel(customLabel) {} bool operator==(const HandStrengthKey& rhs) const; bool operator!=(const HandStrengthKey& rhs) const; HandStrengthKey& operator|=(const HandStrengthKey& rhs); HandStrengthKey& operator&=(const HandStrengthKey& rhs); HandStrengthKey operator~() const; bool operator<(const HandStrengthKey& rhs) const; };wobei HandStrengthDetailType einfach ein uint64 ist.
Die Fehlermeldung ist mir absolut unbegreiflich und ich schaffe es auch nicht sie zu umgehen:
1> HandStrengthSelectionDialog.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(260): error C2678: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const HandStrengthKey' akzeptiert (oder keine geeignete Konvertierung möglich)
1> c:\users\michael\documents\visual studio 2010\projects\ui\elypsonevaluatorbase\handstrengthkey.h(28): kann 'HandStrengthKey &HandStrengthKey::operator =(const HandStrengthKey &)' sein
1> bei Anpassung der Argumentliste '(const HandStrengthKey, const HandStrengthKey)'
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(259): Bei der Kompilierung der Klassen-template der std::pair<_Ty1,_Ty2> &std::pair<_Ty1,_Ty2>::operator =(std::pair<_Ty1,_Ty2> &&)-Memberfunktion
1> with
1> [
1> _Ty1=const HandStrengthKey,
1> _Ty2=std::string
1> ]
1> c:\users\michael\documents\visual studio 2010\projects\ui\...\handstrengthselectiondialog.cpp(113): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::pair<_Ty1,_Ty2>".
1> with
1> [
1> _Ty1=const HandStrengthKey,
1> _Ty2=std::string
1> ] <-- das ist der Code mit *itDie markierte Zeile im untersten Teil der Fehlermeldung ist eben die mit
*it. D.h. er versucht irgendwo (?) eine Zuweisung zu machen.Was ich eigentlich tun will ist eine simple Iteration durch alle map-Elemente. Aber ständig erhalte ich diese dämlichen Fehler, dass die Map ein pair nutzt, dessen first const ist, weswegen die Zuweisung in dieser utility-Funktion nicht klappt.
Irgendwelche Ideen?
Danke im Voraus und beste Grüße!
Eisflamme
-
const HandStrengthNames::HandStrengthNamesMapping HandStrengthNames::names = HandStrengthNames::initialize();Bist du sicher, dass das const da stimmt?
-
Überbleibsel aus der vorherigen Version, wo ich es noch (was viel logischer ist) const hatte, ändert aber nichts, wenn ich das lösche.
~~
Ich fand jetzt noch raus:
Wenn ich HandStrengthKey rauskopiere in die cpp-Datei und in HandStrengthKey2 umbenenne, das DLL_SPECIFIER dann auch lösche, und eine Map nutze, die HandStrengthKey2 statt HandStrengthKey nutzt, meckert er nicht.Kann das irgendwie mit dem DLL_SPECIFIER zusammenhängen? Das ist einfach nur ein #define, was sich zu declspec(__dllimport) bzw. declspec(__dllexport) auflöst, einfach um das in die DLL/lib zu exportieren.~~
Na ja, aber wenn ich dann einfach DLL_SPECIFIER aus der eigentlichen Datei lösche, wo HandStrengthKey definiert ist, hilft es nichts, also ist es wohl Blödsinn.Achso und der operator= von utility will anscheinend irgendwas moven:
pair& operator=(pair<_Ty1, _Ty2>&& _Right) { // assign from moved pair this->first = _STD move(_Right.first); this->second = _STD move(_Right.second); return (*this); }Auch hier stört er sich an der first-Zeile.
Kann das irgendwie mit der Initialisierungsreihenfolge durch dieses static zu tun haben? Denn wenn ich eine entsprechende Iteration in der cpp-Datei mache, in welcher auch das initialize steht, meckert er nicht.
Edit2:Stimmt so nicht... war in einem Fall zwar korrekt, aber nicht in jedem. Kann ich nicht systematisieren.
Und wenn ich so eine Iteration nicht in einer freien Funktion sondern in einer Membermethode mache, auch dann ist es kein Problem?!
-
Kann es sein, daß es daran scheitert?
Microsoft schrieb:
How to export an instantiation of [...] a class that contains a data member that is an STL object [...] The only STL container that can currently be exported is vector. [...]
-
Ich glaube nicht, dass es daran liegt. Der Fehler wird ja auch dann produziert, wenn ich DLL_EXPORT auskommentiere.
Es scheint schon irgendwie mit der Initialisierungsreihenfolge zu tun zu haben. Mein letzter Test war nämlich, dass ich eine Methode/Funktion (egal wie) mit einem Rückgabetyp vectorHandStrengthNamesMapping::value_type hatte. War der drin, haben alle Iterationen über names den mir unverständlichen Fehler (der vom OP) ausgegeben.
Wenn ich die Funktion/Methode gelöscht habe, verschwanden selbige Fehler jedoch, obwohl das ganz klar Code war, der weder in selbiger Funktion/Methode war noch diese aufgerufen hat, auch nicht indirekt.
Es klappt auch, wenn ich in der ÜE, welche initialize() aufruft, eine Funktion mache, die über alle Map-Elemente iteriert, sie in einen vector<pair<HandStrengthKey, string>> kopiert und diesen zurückgibt. Das ist natürlich absolut umständlich und schafft einen totalen Overhead durch den Kopieraufwand. Aber es klappt
