<algorithm> sort, problem



  • hi,

    ok soweit so gut aber irgendwie will es mit dieser memberfunktion auch nicht...

    void car_add(char menue, Fahrzeuge *car, list<Fahrzeuge> *kfz)
    {
        car = new Fahrzeuge;
    //zuweisungen
    	kfz->push_back(*car);
    	//sort( kfz->begin(), kfz->end() );
    	kfz->sort();
    	delete car;
    }
    
    c:\programme\microsoft visual studio 8\vc\include\xutility(276) : 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 "Fahrzeuge" hergeleitet werden.
            c:\programme\microsoft visual studio 8\vc\include\string(151): Siehe Deklaration von 'std::operator <'
            c:\programme\microsoft visual studio 8\vc\include\list(957): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "bool std::_Debug_lt<Fahrzeuge,Fahrzeuge>(_Ty1 &,_Ty2 &,const wchar_t *,unsigned int)".
            with
            [
                _Ty1=Fahrzeuge,
                _Ty2=Fahrzeuge
            ]
            c:\programme\microsoft visual studio 8\vc\include\list(948): Bei der Kompilierung der  Klassen-template der void std::list<_Ty>::merge(std::list<_Ty> &)-Memberfunktion
            with
            [
                _Ty=Fahrzeuge
            ]
            i:\#proggen-fh\_studium fh-worms\_grundstudium\programmieren 2\praktikum\ss2006_aufgabe5\kfz-verwaltung\main.cpp(45): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::list<_Ty>".
            with
            [
                _Ty=Fahrzeuge
            ]
    c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const _Elem *" konnte nicht von "Fahrzeuge" hergeleitet werden.
            c:\programme\microsoft visual studio 8\vc\include\string(141): Siehe Deklaration von 'std::operator <'
    c:\programme\microsoft visual studio 8\vc\include\xutility(276) : 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 "Fahrzeuge" hergeleitet werden.
            c:\programme\microsoft visual studio 8\vc\include\string(131): Siehe Deklaration von 'std::operator <'
    c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)": template-Argument für "const std::list<_Ty,_Ax> &" konnte nicht von "Fahrzeuge" hergeleitet werden.
            c:\programme\microsoft visual studio 8\vc\include\list(1274): Siehe Deklaration von 'std::operator <'
    c:\programme\microsoft visual studio 8\vc\include\xutility(276) : 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 "Fahrzeuge" hergeleitet werden.
            c:\programme\microsoft visual studio 8\vc\include\xutility(1842): Siehe Deklaration von 'std::operator <'
    c:\programme\microsoft visual studio 8\vc\include\xutility(276) : 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 "Fahrzeuge" hergeleitet werden.
            c:\programme\microsoft visual studio 8\vc\include\utility(76): Siehe Deklaration von 'std::operator <'
    c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2676: Binärer Operator '<': 'Fahrzeuge' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht
    c:\programme\microsoft visual studio 8\vc\include\xutility(278) : 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 "Fahrzeuge" hergeleitet werden.
            c:\programme\microsoft visual studio 8\vc\include\string(151): Siehe Deklaration von 'std::operator <'
    c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const _Elem *" konnte nicht von "Fahrzeuge" hergeleitet werden.
            c:\programme\microsoft visual studio 8\vc\include\string(141): Siehe Deklaration von 'std::operator <'
    c:\programme\microsoft visual studio 8\vc\include\xutility(278) : 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 "Fahrzeuge" hergeleitet werden.
            c:\programme\microsoft visual studio 8\vc\include\string(131): Siehe Deklaration von 'std::operator <'
    c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)": template-Argument für "const std::list<_Ty,_Ax> &" konnte nicht von "Fahrzeuge" hergeleitet werden.
            c:\programme\microsoft visual studio 8\vc\include\list(1274): Siehe Deklaration von 'std::operator <'
    c:\programme\microsoft visual studio 8\vc\include\xutility(278) : 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 "Fahrzeuge" hergeleitet werden.
            c:\programme\microsoft visual studio 8\vc\include\xutility(1842): Siehe Deklaration von 'std::operator <'
    c:\programme\microsoft visual studio 8\vc\include\xutility(278) : 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 "Fahrzeuge" hergeleitet werden.
            c:\programme\microsoft visual studio 8\vc\include\utility(76): Siehe Deklaration von 'std::operator <'
    c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2676: Binärer Operator '<': 'Fahrzeuge' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht
    
    KFZ-Verwaltung - 14 Fehler, 0 Warnung(en)
    


  • Deine Klasse Fahrzeug braucht einen operator<

    BTW, warum allokierst und löscht Du sinnlos Speicher, nur um eine Kopie davon in die Liste zu packen?

    kfz->push_back(car( ));
    


  • Du brauchst einen Vergleichsoperator (operator<) für Fahrzeuge, um sortieren zu können. Andernfalls weiß sort() nicht, in welcher Reihenfolge es die Elemente anordnen soll.

    Übrigens macht es deine Parameterübergabe wenig Sinn. Entweder du legst dein 'car' in der Funktion an, dann brauchst du dafür keinen Pointer-Parameter (nimm lieber eine lokale Variable) oder du übergibst ein fertig initialisiertes Objekt:

    //Variante 1:
    void add_car(list<Fahrzeuge>&kfz,const string& modell,int ps/*,...*/)
    {
      Fahrzeuge car;
      //car initialisieren
      kfz.push_back(car);
      ...
    }
    
    add_car(kfz_list,"VW Golf",100/*,...*/);
    
    //Variante 2:
    void add_car(list<Fahrzeuge>&kfz,const Fahrzeuge& car)
    {
      kfz.push_back(car);
      ...
    }
    
    Fahrzeuge auto;
    //auto initialisieren
    add_car(kfz_list,auto);
    


  • hmm

    ich hab mir das so gedacht, ich leg ein objekt zu der klasse an, lese die werte ein, lege es in der liste ab und lösche das objekt wieder...
    sry programmiere noch nicht lange c++ ( klassen etc.. ).

    werde später versuchen deine methode umzusetzen cstoll. danke schön!



  • Da_Pedro schrieb:

    ich hab mir das so gedacht, ich leg ein objekt zu der klasse an, lese die werte ein, lege es in der liste ab und lösche das objekt wieder...

    Gute Idee, nur ist es Overkill, dafür die Heap-Verwaltung anzuwerfen 😉 Stack-Objekte (=lokale Variablen) sind um einiges schneller.



  • CStoll schrieb:

    Stack-Objekte (=lokale Variablen) sind um einiges schneller.

    *Hmmm* *grümel*
    Man kann Objekte doch auf dem Stack schneller anlegen und entfernen als aufm Heap, oder ? Das meint dein "schneller" auch .. ?

    Aber der Zugriff auf Objekte auf dem Stack/Heap ist doch gleich schnell ... ??


  • Mod

    Freak_Coder schrieb:

    CStoll schrieb:

    Stack-Objekte (=lokale Variablen) sind um einiges schneller.

    *Hmmm* *grümel*
    Man kann Objekte doch auf dem Stack schneller anlegen und entfernen als aufm Heap, oder ? Das meint dein "schneller" auch .. ?

    Aber der Zugriff auf Objekte auf dem Stack/Heap ist doch gleich schnell ... ??

    der zugriff ja, aber die reservierung des speichers (und die spätere freigabe) ist auf dem stack praktisch völlig ohne zeitkosten, beim freestore sieht das anders aus. in diesem einfachen fall würde ich auf eine lokale variable ganz verzichten und gleich nur ein temporäres objekt anlegen. also

    kfz->push_back(Fahrzeuge());
    


  • du sagst ich brauche einen vergleichsoperator < aber wo ist der in deinem bsp? muss ich dafür eine const variable anlegen um diese vergleichen zu können?

    ich poste mal wie meine funktion aussieht, sortiert werden soll nach nummernschild..:

    void car_add(char menue, list<Fahrzeuge> *kfz)
    {
    	string nrschild, hersteller, modell, km, kraftstoff;
    
    	Fahrzeuge car;
    
    	cout << "Bitte Fahrzeugdaten eingeben" << endl << endl;
    	cout << "Nummernschild: ";
    	getline(cin,nrschild);
    	cout << "Hersteller: ";
    	getline(cin,hersteller);
    	cout << "Modell: ";
    	getline(cin,modell);
    	cout << "Kilometer: " ;
    	getline(cin,km);
    	cout << "Kraftstoff: ";
    	getline(cin,kraftstoff);
    
    	car.set_nrschild(nrschild);
    	car.set_hersteller(hersteller);
    	car.set_modell(modell);
    	car.set_km(km);
    	car.set_kraftstoff(kraftstoff);
    
    	kfz->push_back(car);
    	//sort( kfz->begin(), kfz->end() );
    	kfz->sort();
    
    	system("cls");
    }
    

    meine klasse sieht so aus:
    .h

    class Fahrzeuge
    {
    public:
    	Fahrzeuge();
    	~Fahrzeuge(void);
    
    	void set_nrschild(string);
    	string get_nrschild();
    //...
    protected:
    	string nrschild,//...restliche var
    

    .cpp

    void Fahrzeuge::set_nrschild(string dummy_nrschild)
    {
    	nrschild = dummy_nrschild;
    }
    string Fahrzeuge::get_nrschild()
    {
    	return nrschild;
    }
    


  • Deine Klasse Fahrzeuge braucht einen Vergleichsoperator, wie soll sie sonst sortiert werden.
    Global sieht das etwa so aus

    bool  operator<( const Fahrzeuge& lhs, const Fahrzeuge& rhs)
    {
    // nun der Code für den Vergleich
    }
    


  • aso ich muss den operator für meine bedürfnisse überladen... jetzt klingelts. vielen dank


Anmelden zum Antworten