for( iter = vList.begin( ); iter != vList.end( ); iter++ ), geht nicht? Wieso?



  • Komisch wenn ich auf release stelle gehts...



  • hast du im debug mode auch alle notwendigen libs angegeben?
    vergleich doch die release libs mit denen im debug mode...



  • Jo, ich lass das jetzt so. Aber sorry wenn ich hier noch etwas anderes posten muss, wollte aba net extra neuen Thread aufmachen. und zwar funktioniert hier die .sort der liste nicht, obwohl ich doch den '<' operator ueberladen habe?

    struct LISTE {
    
    	char szCountry2[  8 ];
    	char szCountry3[  8 ];
    	char szFullName[ 64 ];
    
    	bool operator <( const LISTE *newItem ) const {
    
    		return( this->szFullName < newItem->szFullName );
    	}
    };
    

    Meldung:

    1>C:\Programme\Microsoft Visual Studio 9.0\VC\include\list(993) : error C2679: binary '<' : no operator found which takes a right-hand operand of type 'LISTE' (or there is no acceptable conversion)
    1>        .\ParsIT.cpp(13): could be 'bool LISTE::operator <(const LISTE *) const'
    1>        while trying to match the argument list '(LISTE, LISTE)'
    1>        C:\Programme\Microsoft Visual Studio 9.0\VC\include\list(984) : while compiling class template member function 'void std::list<_Ty>::merge(std::list<_Ty> &)'
    1>        with
    1>        [
    1>            _Ty=LISTE
    1>        ]
    1>        .\ParsIT.cpp(19) : see reference to class template instantiation 'std::list<_Ty>' being compiled
    1>        with
    1>        [
    1>            _Ty=LISTE
    1>        ]
    

    Gruß Tobi.



  • struct LISTE {
    
    	char szCountry2[  8 ];
    	char szCountry3[  8 ];
    	char szFullName[ 64 ];
    
    	bool operator <( const LISTE *newItem ) const {
    
    		return( this->szFullName < newItem->szFullName );
    	}
    };
    

    -->

    struct LISTE {
    
    	char szCountry2[  8 ];
    	char szCountry3[  8 ];
    	char szFullName[ 64 ];
    
    	bool operator <( const LISTE &newItem ) const {
    
    		return( this->szFullName < newItem.szFullName );
    	}
    };
    

    Edit:

    Außerdem bin ich mir nicht sicher, ob man bei arrays einfach größer/kleiner Vergleiche durchführen kann.
    (mit lexicographical_compare() oder so dürfte es aber gehen)

    Edit2:
    Ich Dummkopf.
    Natürlich gehen die Vergleiche, allerdings werden nur die Zeigeradressen verglichen.



  • Hm es kommt zwar kein Fehler mehr, aber sortiert ist die liste anscheind nicht.



  • Schau mal bitte, was ich bei "Edit2" geschrieben habe.



  • EDIT: zu spät



  • Ich möchte aber die Werte und nicht die Adressen vergleichen lassen.

    PS: Bzw. wie soll ich lexicographical_compare benutzen ein einziges Array zu sortieren?



  • Dann nutze wie schon geschrieben lexicographical_compare() aus <algorithm> an. Oder bastel dir eine eigene schleife und geh die Buchstaben durch.



  • Am einfachsten wird wohl fürs erste strcmp sein. Die lexicographical_compare Variante könnte aber schneller sein, wenn man die Länge der Strings wüsste.

    @TObi:
    Du sollst es nicht zum sortieren benutzen, sondern zum vergleichen. Mit strcmp oder lexicographical_compare kannst Du die Inhalte zweier (strcmp: nullterminierten) char-Arrays vergleichen.



  • Es ärgert mich aber irgendwie, denn ich bin mir sicher das ich das schon einmal mit dem überladen des '<' operators gemacht habe, versteh wirklich net wieso das jetzt son problem ist für mein compilier ...



  • Der Compiler macht genau das was er soll. Nur du sagst ihm, dass er was anderes machen soll als du möchtest 😃



  • Wieso sag ich ihm was anderes?



  • T0bi schrieb:

    Es ärgert mich aber irgendwie, denn ich bin mir sicher das ich das schon einmal mit dem überladen des '<' operators gemacht habe, versteh wirklich net wieso das jetzt son problem ist für mein compilier ...

    Es geht doch garnicht um den operator<, sondern um das, was darin passiert. Wenn die Operator-Funktion (konstante) Referenzen annimmt, funktioniert das ganze einwandfrei. Das Problem ist: Im operator< sagst Du ihm, dass er zwei Zeiger vergleichen soll. Das willst Du aber nicht, sondern Du willst die Inhalte vergleichen. Das macht man mit strcmp oder lexidings_compare. Im ansonsten vollkommen korrekten operator<.



  • also quasie so:

    bool operator <( const LISTE &newItem ) const {
    
         return( lexicographical_compare( ... );
    }
    

    ???

    Aber wie muss ich das dann in der lexicographical_compare schreiben?



  • bool operator <( const LISTE &newItem ) const {
    
    		return( lexicographical_compare( this->szFullName, this->szFullName + strlen( this->szFullName ),
    								         newItem.szFullName, newItem.szFullName + strlen( newItem.szFullName ) ) );
    	}
    

    olala.. es geht xD Danke.
    Kann mich trotzdem nicht daran erinnern das ich das damals auch so gemacht habe.
    Trotzdem dake.

    Gruß Tobi.



  • Wahrscheinlich hast du damals std::string benutzt.


Anmelden zum Antworten