Includes scheinen nicht richtig zu funktionieren (unerkärlicher Fehler!)
-
Ich habe es geschafft, dass das ganze mit den Includes reibungsfrei funktioniert.
Doch wenn ich jetzt in der Klasse
Worldstd::map<Bit25, Block_Container> Welt;, schreibe (im Header), dann erhalte ich folgende Fehlermeldung:------ Erstellen gestartet: Projekt: Block_Forge, Konfiguration: Debug Win32 ------ World.cpp c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)": template-Argument für "const std::_Tree<_Traits> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\xtree(1885): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(124): Bei der Kompilierung der Klassen-template der bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const-Memberfunktion with [ _Ty=Bit25 ] c:\programme\microsoft visual studio 10.0\vc\include\map(71): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::less<_Ty>". with [ _Ty=Bit25 ] c:\programme\microsoft visual studio 10.0\vc\include\xtree(451): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,_Mfl>". with [ _Kty=Bit25, _Ty=Block_Container, _Pr=std::less<Bit25>, _Alloc=std::allocator<std::pair<const Bit25,Block_Container>>, _Mfl=false ] c:\programme\microsoft visual studio 10.0\vc\include\xtree(520): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Tree_nod<_Traits>". with [ _Traits=std::_Tmap_traits<Bit25,Block_Container,std::less<Bit25>,std::allocator<std::pair<const Bit25,Block_Container>>,false> ] c:\programme\microsoft visual studio 10.0\vc\include\xtree(659): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Tree_val<_Traits>". with [ _Traits=std::_Tmap_traits<Bit25,Block_Container,std::less<Bit25>,std::allocator<std::pair<const Bit25,Block_Container>>,false> ] c:\programme\microsoft visual studio 10.0\vc\include\map(81): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Tree<_Traits>". with [ _Traits=std::_Tmap_traits<Bit25,Block_Container,std::less<Bit25>,std::allocator<std::pair<const Bit25,Block_Container>>,false> ] e:\eigene dateien\visual studio 2010\projects\map\block_forge\world.h(9): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::map<_Kty,_Ty>". with [ _Kty=Bit25, _Ty=Block_Container ] c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)": template-Argument für "const std::_Tree<_Traits> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\xtree(1885): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::unique_ptr<_Ty,_Dx> &,const std::unique_ptr<_Ty2,_Dx2> &)": template-Argument für "const std::unique_ptr<_Ty,_Dx> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\memory(2582): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::unique_ptr<_Ty,_Dx> &,const std::unique_ptr<_Ty2,_Dx2> &)": template-Argument für "const std::unique_ptr<_Ty,_Dx> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\memory(2582): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\string(243): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\string(243): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const _Elem *" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\string(233): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\string(223): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\string(223): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\xutility(1356): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\xutility(1356): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)": template-Argument für "const std::_Revranit<_RanIt,_Base> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\xutility(1179): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)": template-Argument für "const std::_Revranit<_RanIt,_Base> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\xutility(1179): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)": template-Argument für "const std::pair<_Ty1,_Ty2> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\utility(318): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2784: "bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)": template-Argument für "const std::pair<_Ty1,_Ty2> &" konnte nicht von "const Bit25" hergeleitet werden. c:\programme\microsoft visual studio 10.0\vc\include\utility(318): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2676: Binärer Operator '<': 'const Bit25' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht Code wird generiert... Kompilieren... main.cpp Code wird generiert... Überspringen... (keine relevanten Änderungen gefunden) Block_Container.cpp BF_Error.cpp ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Weiß einer, was da los ist?
Interresant ist auch, dass das
typedef std::map<Bit25, Block_Container>::iterator WorldIter;funktioniert!!!
-
Da hast du wohl jetzt die Definition von 'Bit25' nicht mehr der Klasse zugänglich gemacht (wahrscheinlich das include gelöscht und nur eine Vorwärtsdeklaration eingefügt), also
#include <bitset> typedef std::bitset<25> Bit25;
-
Das kann es nicht sein. Das habe ich als erstes ausprobiert. Und außerdem funktioniert die Deklaration/Definition
typedef std::map<Bit25, Block_Container>::iterator WorldIter;Da ist auch Bit25 drin!
Nur
std::map<Bit25, Block_Container> Welt;in der Klasse als Membervariable funktioniert nicht!
-
Ein bitset unterstützt nicht den Kleiner-Operator (<), daher kannst du diesen wohl nicht in einer map als Key angeben, s.a. http://www.cplusplus.com/reference/stl/bitset
Evtl. könntest du selber der map als dritten Parameter eine Vergleichsfunktion anbieten (welche auf Basis von to_ulong zwei bitsets vergleicht).
-
Wie sähe der Aufruf von map dann aus?
-
Die erinnerung schrieb:
Also meinst du im Prinzip, dass ich alle includes in eine eigene Header-Datei-stecken soll und die in alle anderen Datein includen?
Nein? Ich habe nichts annähernd in der Richtung gesagt...
Die erinnerung schrieb:
Wie sähe der Aufruf von map dann aus?
Aufruf? Du meinst Deklaration/Definition?
std::maphat einen dritten Templateparameter, welcher dazu genutzt werden kann, einen Funktortyp zu übergeben. Standardmässig ist das die Klasseless<T>, welche denoperator <verwendet. Du könntest daher diese Klasse für deinbitsetspezialisieren oder, was ich eher empfehlen würde, einen eigenen Funktor schreiben.Zum Beispiel:
struct Bit25Comparator { bool operator ()(Bit25 const& lhs, Bit25 const& rhs) const { // ... mach hier deinen Vergleich und gib das Ergebnis zurück } }; typedef std::map<Bit25, Block_Container, Bit25Comparator> World;Grüssli
-
Ich habs jetzt anders gelöst:
Mit
unordered_map!Ist im Prinzip das gleiche, wie map, nur, dass hier nichts sortiert wird!
-
Die erinnerung schrieb:
Ist im Prinzip das gleiche, wie map, nur, dass hier nichts sortiert wird!
Aja? Das ist mir neu.
Im übrigen funktioniert dies nur, weil es in C++11 eine Spezialisierung von
std::hashfürstd::bitsetgibt. Auchstd::unordered_maphat einen dritten Templateparameter wiestd::map.Ich habe langsam das Gefühl, du umschiffst all deine Unkenntnisse und behebst dies mit sehr fragwürdigen Methoden. Vielleicht solltest du eher mal versuchen, dein Wissen aufzupeppen.
Grüssli
-
Dravere schrieb:
Ich habe langsam das Gefühl, du umschiffst all deine Unkenntnisse und behebst dies mit sehr fragwürdigen Methoden.
Wer umschifft den nicht seine Unkenntnisse?
Ich weiß ja nichtmal, wonach ich suchen soll!
Aber unordered_map ist, denke ich, für mein Problem besser, da ich hier teilweise bis zu 16 Mio. (fast 17) Elemente speichern können muss, und kein Bedarf herrscht, die sortiert zu haben.
Falls meine Meinung hier falsch sein sollte, kläre mich bitte auf!
-
Die erinnerung schrieb:
Wer umschifft den nicht seine Unkenntnisse?
So gut wie alle? Wenn ich etwas nicht weiss, dann informiere ich mich darüber. Sonst wähle ich womöglich eine ungünstige oder gar schlechte Lösung aus. Und vor allem bilde ich mich nie weiter und werde diese Unkenntnis immer haben.
Die erinnerung schrieb:
Ich weiß ja nichtmal, wonach ich suchen soll!
Dann frag! Dazu ist das Forum ja da! Wir haben hier schon einige Begriffe genannt, nach welchen du suchen kannst und sonst darfst du ja gerne nachfragen, falls du zu etwas wirklich nichts findest.
Die erinnerung schrieb:
Aber unordered_map ist, denke ich, für mein Problem besser, da ich hier teilweise bis zu 16 Mio. (fast 17) Elemente speichern können muss, und kein Bedarf herrscht, die sortiert zu haben.
Das kommt ganz auf den Problemfall und die Implementierung von
std::mapundstd::unordered_mapan. Dassstd::mapdie Elemente nach einem Schlüssel sortiert, ist einfach nur ein Nebenprodukt davon, wie die Elemente abgelegt werden. Ich setze oftstd::mapein und benötige es nicht, dass die Elemente sortiert sind.Grüssli
-
Wie ja schon gesagt:
Das sollen bis zu 16 Mio. Elemente rein. Und wenn dann bei jedes neues Element erstmal frisch ein sortiert werden muss, dauert das dann doch recht lange.
Deshalb bin ich in diesem Fall für unordered_map.
-
16 Mio. Elemente?
Und dann Quelltext, von dem der Autor nicht genau weiss was abgeht?Mutig, mutig.
Okay, diese 16 Mio.Elemente schreibst du in die Map. Und wozu? Sollen die wieder ausgelesen werden? In einem Rutsch? Nach bestimmten Kriterien?
-
Erstens: Wenn ein neues Element in eine std::map eingeügt wird, muss deshalb nicht die gesamte Map neu sortiert werden. Es muss nicht mal der Inhalt der Map hin- und hergeschoben werden. In der Regel steckt hinter std::map ein RB-Baum; von dessen Laufzeitverhalten kannst du also ausgehen.
Zweitens: Hashmaps (eine solche ist unordered_map) können eine Menge Performance bringen, im Umgang mit ihnen ist aber einige Vorsicht geboten. Wenn du nicht weißt, wie eine Hashmap funktioniert, lass die Finger davon. Lass insbesondere dann die Finger davon, wenn die Daten aus einer nicht vertrauenswürdigen Quelle kommen und/oder du nicht überblicken kannst, wie die Verteilung deiner Schlüsselwerte vermutlich aussieht. Wer solche Bedenken beiseite schiebt, macht sich verwundbar.
-
Nein, ich brauch das für ein Spiel. Die Map besteht halt aus bis zu 16 Mio. Elementen/Blöcken.
Und da brauche ich eine effiziente Verwaltung. Die Elemente füge ich selbst ein und ich verwalte sie auch.
-
Ein Spiel?
Sind das diese Dinger mit 23,546 Frames/Minute
Wenn nicht, musst du, glaube ich, deine Programmierfähigkeiten noch deutlich updaten

-
Wieso?
Also ich verstehe den Sinn deiner Antwort nicht!