Vergleich zwischen (*(deque<string>::iterator)) und const char*
-
Hallo,
Um o.g. Vergleich vergleichen zu koennen, hab ich folgendes versucht
(Erst mal die entsprechenden Deklarationen usw:std::deque<std::string> tag_hiracne; // deque std::deque<std::string>:: reverse_iterator hthIT; // iterator dekl. hthIT = tag_hiracne.rbegin(); // iterator akt. Wert):
)
1)bool tr = ((*hthIT) == "table");
=> incomplete type
bool tr = ((*hthIT).c_str() == "table");
=> incomplete type
bool tr = (*hthIT).operator==("table");
=> no matching function for call to `std::basic_string<char,
std::char_traits<char>, std::allocator<char> >::operator==(const char[6])'
Obwohl deque<string>War die Wahl eines deque's hierfuer nicht ausreichend, oder gibt's da doch Vergleichsmoeglichkeiten??
Oder mach grundlegend was falschThanx
-
bool tr = ((*hthIT) == "table");
...sollte eigentlich klappen. Probier mal zu Not:
bool tr = ((*hthIT) == std::string("table"));
-
die Variante [bool tr = ((*hthIT) == std::string("table"));] hatte ich meiner aufzaehlung vergessen, sorry.
MaSTaH schrieb:
bool tr = ((*hthIT) == "table");
...sollte eigentlich klappen. Probier mal zu Not:
bool tr = ((*hthIT) == std::string("table"));
fuehrt leider auch zu:
incomplete type
-
<string> eingebunden? Vielleicht ist davon nur eine Vorwärtsdeklaration sichtbar (-> incomplete type)
-
Mit "eingebunden?" und "Vorwärtsdeklaration" fange ich leider (noch)nix an
meinst du, ich muss an der stelle wieder mal ein Stringobjekt erzeugen (std::string table("table")); nur um vergleichen zu koennen?
OK, war quatsch, ich kann an der stelle garnicht erzeugen.Aber ich wuerd den Vergleich ganz gern durchfuehren
-
war laturnich mein fehler (aber wenigstens nicht segmentativ
hatte beim posten was verschluckt bzw. selber uebersehn:
stattbool tr = ((*hthIT) == "table");
hatte ich die debug-variable tr als const
const bool tr = ((*hthIT) == "table");
deklariert (haette aber hierfuer nie einen Zusammenhang vermutet, aber...), ohne const tuts!
Tanx again
SF
-
Segmentation Faulter schrieb:
Mit "eingebunden?" und "Vorwärtsdeklaration" fange ich leider (noch)nix an
Mit "eingebunden" mein ich nichts anderes als das altbekannte #include<string>, und eine Vorwärtsdeklaration sieht ungefähr so aus: class Klasse;
Eine Klasse, von der es nur eine Vorwärsdeklaration gibt, ist technisch gesehen ein 'incomplete type'. Diese Typen haben die Eigenschaft, dass man nicht auf ihre Members zugreifen kann. Man kann sie nur in Form von Zeigern und Referenzen sowie als Funktionsrückgabetyp in Deklarationen verwenden.
Nun wär es theoretisch möglich, dass in den Headern, die du eingebunden hast, eine Vorwärtsdeklaration von string vorkommt, aber nirgends die vollständige Deklaration, so dass es zu diesen Fehler kommt. Muss aber nicht, war mehr oder weniger ein Schuss ins Blaue.
-
Hallo,
bleibt noch zu vermerken, dass
bool tr = ((*hthIT).c_str() == "table");
nicht funktionieren kann, da hier lediglich Speicheradressen verglichen werden
(.c_str() liefert ein const char *).mfg
v R
-
Hallo,
es fehlt mir zwar noch der Einblick in die interne Struktur, weswegen ich nicht wirklich viel zum Vergleich von Speicheradressen sagen kann, aber:
virtuell Realisticer schrieb:
Hallo,
bleibt noch zu vermerken, dass
bool tr = ((*hthIT).c_str() == "table");
nicht funktionieren kann, da hier lediglich Speicheradressen verglichen werden
(.c_str() liefert ein const char *).mfg
v Rkann ich so nicht bestaetigen, da mir o.g Vergleich die noetigen Fallunterscheidungen liefert. Dennoch wurde ich hierzu gern mehr erfahren:
- wie unterscheiden sich denn die Speicheradressen, wenn (*hthIT) tatsaechlich die Literale "table" beinhaltet?
- falls ein Unterschied zwischen der Speicheradresse und dem Inhalt besteht, wie muesste denn der vergleich aussehn, um den Inhalt zu vergleichen?
- warum funktioniert das Programm?
- was ist der Unterschied zwischen X.c_str() (liefert ein const char ) und "text" (nicht auch ein const char ??).Wer kann meine Verwirrung entsorgen?
Thanx schonmal,
mfg
SF
-
Du vergleichst mit diesem Ausdruck die Adressen. Wenn die gleich sind, dann ist sicher auch der Inhalt gleich. Klar. Aber genau der selbe Text kann ja auch an mehreren verschiedenen Stellen im Speicher stehen, und dann sind die Adressen eben nicht gleich und Dein Vergleich oben gibt ungleich aus, obwohl die beiden Texte gleich sind.
-
Womit wieder meine urspruengliche Frage ins Spiel kommt:
Hab ich mit dem deque einen zu machtlosen Container benutz (map z.B. bietet compare und die davon abgeleiteten? relationalen Operatoren)?
Oder gibt es doch eine Moeglichkeit, den Vergleich speicheradressenunabhaengig durchzufuehren?Thanx schonmal
SF
-
Mit deque hat das an der Stelle überhaupt nichts zu tun.
-
Also ohne das .c_str() sollte es eigentlich funktionieren.
MfG Jester
-
Hallo,
hier mal ein kleines Beispiel:
const char *Test1 = "Hallo"; //Test1 zeigt, sagen wir mal, auf 0x0000000A const char *Test2 = "Hallo"; //Test2 zeigt, sagen wir mal, auf 0x00000020 ;) //vergleichen von Speicheradressen if(Test1 == Test2) //die adressen sind unterschiedlich (s. festlegung oben) std::cout<<"Zeigen auf gleiche Speicheradresse"<<std::endl; else std::cout<<"Zeigen auf unterschiedliche Speicheradresse"<<std::endl; //vergleichen der Zeichenketten (Hallo) if(strcmp(Test1,Test2)==0) //die zeichenketten sind identisch (s. o.) std::cout<<"Zeichenketten sind identisch"; else std::cout<<"Zeichenketten sind nicht identisch";
So, denke das sollte verstaendlich sein
mfg
v R
-
@virtuell Realisticer
Na das war doch jetzt mal richtig verstaedlich
Danke vielmals