JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=7c7aa0799deaee7b6da63fdd784cb77cMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

std::find() gibt const_iterator zurück !?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 08.08.2006, 19:29    Titel: std::find() gibt const_iterator zurück !? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 08.08.2006, 19:43    Titel: Re: std::find() gibt const_iterator zurück !? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 08.08.2006, 19:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 08.08.2006, 19:55    Titel: Antworten mit Zitat

Very Happy 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 Smile

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 08.08.2006, 20:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 08.08.2006, 23:09    Titel: Antworten mit Zitat

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 Wink
Wieder was gelernt !
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 09.08.2006, 05:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Mat
Senior JLI'ler


Alter: 36
Anmeldedatum: 17.09.2005
Beiträge: 205
Wohnort: Koblenz
Medaillen: Keine

BeitragVerfasst am: 09.08.2006, 06:58    Titel: Antworten mit Zitat

SChon klar Wink - das ist ja gerade das blöde !
_________________
- - - - - - - - - - - - - - - - - - - -
-> http://www.sea-productions.de
-> http://www.krawall.de
- - - - - - - - - - - - - - - - - - - -
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum