Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Mat Senior JLI'ler
Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 08.08.2006, 19:29 Titel: std::find() gibt const_iterator zurück !? |
|
|
Hey,
habe ein seltsames Problem ..
Normalerweise kann man find() ja sehr schön nutzen wie hier CPP: | list<int> Liste;
Liste.push_back(123);
Liste.push_back(134);
Liste.push_back(959);
list<int>::iterator result = find(Liste.begin(), Liste.end(), 134); |
Jetzt benutze ich anstatt int - std::string als Container-Inhalt. Daraufhin meckert der Compiler
c:\coding\c++\entwicklung\suze\suze -station\_directory.h(56) : error C2440: 'const_cast' : 'class std::list<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,st
ruct std::char_traits<char>,class std::allocator<char> > > >::const_iterator' kann nicht in 'class std::list<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,st
ruct std::char_traits<char>,class std::allocator<char> > > >::iterator' konvertiert werden
Konvertierung erfordert einen Konstruktor oder einen benutzerdefinierten Konvertierungsoperator, der nicht von dem const_cast-Operator oder reinterpret_cast-Operator verwendet werden kann
Der verwendete Code sieht übrigens dermaßen aus:
CPP: | bool CheckSubDir(char* name) const
{
std::string Buffer = name;
std::list<std::string>::iterator result = const_cast<std::list<std::string>::iterator> (std::find(lSubDirs.begin(), lSubDirs.end(), Buffer)); // Habe es natürlich zunächst ohne den const_cast<> versucht, aber genau so ohne Erfolg ;(
if(it==lSubDirs.end()) return false;
else return true;
}
|
EDIT :
CPP: | std::list<std::string> lSubDirs; |
So wurde übrigens lSubDirs deklariert..
Vielleicht habt ihr ja eine Antowrt oder Tipps ;) Danke ! _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 08.08.2006, 19:43 Titel: Re: std::find() gibt const_iterator zurück !? |
|
|
Entferne mal das 'const' im Funktionskopf.
Mat hat Folgendes geschrieben: | CPP: | if(it==lSubDirs.end()) return false;
else return true; |
|
Sollte das eventuell...
CPP: | if(result==lSubDirs.end()) return false;
else return true; |
...heißen?
Zuletzt bearbeitet von GreveN am 08.08.2006, 19:49, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 08.08.2006, 19:48 Titel: |
|
|
Jup, IT tauch doch sonst nirgendswo in der Funktion auf. Muss wohl außerhalb deklariert sein und n anderen Typ haben oder so. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Mat Senior JLI'ler
Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 08.08.2006, 19:55 Titel: |
|
|
Supi - danke !
Das mit dem Namen kam zwischendurch rein .. hatte erst bei beiden it verwendet, als ich dann gegrübelt und gegrübelt habe, habe ich das (wenn auch überflüssig) zum Verständnis verbessert ...
Das mit dem const oben ist mir garnicht mehr aufgefallen, wäre ich nie mehr drauf gekommen
PS: warum liefert der mir ausgerechnet bei std::string als Containerinhalt einen anderen Typ als gewöhnlich, wenn ich die Funktion als const auslege ?
Habt ihr da einen Schimmer ? _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 08.08.2006, 20:42 Titel: |
|
|
Ist etwas schwierig zu erklären und will jetzt auch nichts Falsches sagen, aber das 'const' verhindert, dass der logische Zustand des Objektes verändert wird. Die Member der Klasse werden also praktisch als 'const' betrachtet, wenn man nun im Hinterkopf hat, dass 'std::find' als Template implementiert ist und genau den Input-Iterator-Typ zurückliefert, den es übergeben bekommt, so erscheint das Verhalten logisch. |
|
Nach oben |
|
|
Mat Senior JLI'ler
Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
Verfasst am: 08.08.2006, 23:09 Titel: |
|
|
Hmmm ... joa, stimmt eigendlich schon, wobei ich mich frage warum man den Iterator dann nicht wenigstens umcasten kann, es handelt sich hier ja um einen eigenen Typ von iterator (const_iterator).
Zum Handhaben ist das recht unschön.
Naja, wie dem auch sei
Wieder was gelernt ! _________________ - - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - - |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 09.08.2006, 05:52 Titel: |
|
|
Mat hat Folgendes geschrieben: | ...es handelt sich hier ja um einen eigenen Typ von iterator (const_iterator).
Zum Handhaben ist das recht unschön. |
Eben deshalb geht es nicht, da 'const_iterator' und 'iterator' so in keinem Bezug zueinander stehen, es sind 2 eigentlich voneinander unabhängige Klassen. Woher soll der Compiler wissen, dass das Eine die 'const'-Variante vom Andern ist und nicht irgendetwas anderes? ;) Und 'const_cast' sollte sowieso vermieden werden. ;) |
|
Nach oben |
|
|
Mat Senior JLI'ler
Alter: 36 Anmeldedatum: 17.09.2005 Beiträge: 205 Wohnort: Koblenz Medaillen: Keine
|
|
Nach oben |
|
|
|