Frage zu Template classe



  • Hi,

    ich versuche eine template Klasse "speicher" zu schreiben, die nichts anderes macht als nur einen Wert zu speichern. (Wrapper classe)

    Nun möchte ich Objekte dieser Klasse sortieren können.
    Dafür habe ich den Operator < überladen.

    Soweit funktioniert das auch. Nun möchte ich, dass die Sortierfunktion ebenfalls mit Templates arbeitet. Dies funktioniert auch.

    Wenn ich aber versuche zwei Objekte der Klasse "speicher" sortieren zu lassen, geht es nicht.
    (Fehlerstelle und Fehlerausgabe steht als Kommentar im Code in "main".)

    #include <Windows.h>     //für Sleep()
    #include <Iostream>		 //für die Ausgabe
    using namespace std;	 
    
    template <class T2>  
    class speicher											//Dient nur der Speicherung eines Wertes					
    {
    	public:
    	T2 wert;
    	speicher(T2 wert_):wert(wert_){}					//Konstruktor
    	speicher(const speicher& a): wert(a.wert){};		//copy Construktor
    
    	T2 gib_wert() {return wert;}						//gibt "wert" zurück
    
    	bool operator < (speicher s) {return wert < s.gib_wert();}	//Operator < definieren
    
    };
    
    template <typename T>		//soll das Maximum von zwei Pararmetern berechnen.
    T finde_Maximum(T a,T b)
    {
    	if(a<b) return b;
    	return a;
    
    }
    
    int main()
    {
    
    	//test der "finde_maximum" Methode
    	int xi = 5;
    	int yi = 7;
    	cout << finde_Maximum(xi,yi) << "\n";
    
    	double xd = 6.543;
    	double yd = 6.765;
    	cout << finde_Maximum(xd,yd) << "\n";
    
    	//test der "speicher" Klasse
    	speicher<int>* s1 = new speicher<int>(5);	
    	//Zeiger auf Objekt der Klasse "speicher" mit Wert 5
    	speicher<int>* s2 = new speicher<int>(7); 
    	//Zeiger auf Objekt der Klasse "speicher" mit Wert 2
    
    	cout << s1->gib_wert() << "\n";
    	cout << s2->gib_wert() << "\n";
    
    	 bool ergebnis= (*s1<*s2);
    	 if (ergebnis) {cout << "true \n";}
    	 else {cout << "false \n";}
    
    	//Bis hierhin funktioniert alles.
    
    	//Dieses funktioniert nicht.
    	//Es kommt der Fehler:
    	//error C2955: "speicher": Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich.
    	speicher maximum = finde_Maximum<speicher>(*s1,*s2)
    
    	Sleep(20000);
    	return 1;
    
    }
    

    Was muß ich anders machen, damit es geht?



  • MisterX schrieb:

    //error C2955: "speicher": Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich.
    	speicher maximum = finde_Maximum<speicher>(*s1,*s2);
    //-----------------müsste glaub ich in diesem Fall so lauten:
    	speicher<int> maximum = finde_Maximum<speicher>(*s1,*s2);
    //Denn du musst ja immernoch angeben, was da in deinem Speicher gelegt wird
    

    Was muß ich anders machen, damit es geht?

    Gruß UsYer



  • Danke für die Hilfe, aber das scheint nicht der Fehler zu sein.
    Denn wenn ich nur

    finde_Maximum<speicher>(*s1,*s2);
    

    schreibe ohne das Ergebnis zuzuweisen erhalte ich den selben Fehler wie in meinem ersten Post im code genannt.

    Was kann sonst noch der Fehler sein?



  • Du musst schon bei jedem Vorkommen von speicher die Templateargumentliste angeben.

    speicher<int> maximum = finde_Maximum<speicher<int> >(*s1,*s2); // oder:
    speicher<int> maximum = finde_Maximum(*s1,*s2);
    

    Abgesehen davon solltest du mit new angelegten Speicher wieder mit delete freigeben (weshalb machst du das überhaupt?) und den Vergleichsoperator eventuell global machen.



  • Nexus schrieb:

    Du musst schon bei jedem Vorkommen von speicher die Templateargumentliste angeben.

    speicher<int> maximum = finde_Maximum<speicher<int> >(*s1,*s2); // oder:
    speicher<int> maximum = finde_Maximum(*s1,*s2);
    

    Abgesehen davon solltest du mit new angelegten Speicher wieder mit delete freigeben (weshalb machst du das überhaupt?) und den Vergleichsoperator eventuell global machen.

    Danke!!!!



  • Noch ein paar Design Tipps:

    template <class T2>  
    class speicher											//Dient nur der Speicherung eines Wertes					
    {
    	public:
    	T2 wert;      // wert sollte private sein
    	speicher(T2 wert_):wert(wert_){}  //	( const T2& wert )benutzen			
    	speicher(const speicher& a): wert(a.wert){};  // brauchst du hier nicht
    
    	T2 gib_wert() {return wert;}  // <- const T2& gib_wert() const {...}						
    
            // op< global machen und wieder const speicher& s
    	bool operator < (speicher s) {return wert < s.gib_wert();}	
    };
    
    // std::max benutzen
    template <typename T>
    T finde_Maximum(T a,T b)
    {
        if(a<b) return b;
        return a;
    
    }
    


  • MisterX schrieb:

    ...Danke!!!!

    Hi MisterX,

    auf diese - sehr wesentliche - Frage bist Du bislang noch nicht eingegangen:

    Nexus schrieb:

    ...
    Abgesehen davon solltest du mit new angelegten Speicher wieder mit delete freigeben (weshalb machst du das überhaupt?) ...

    (oder habe ich das übersehen?)

    Auch wenn sie sic nicht auf Dein aktuelles Problem bezieht, kann Dir ein wenig Nachdenken an dieser Stelle eine Menge zukünftigen Ärger sparen.

    Gruß,

    Simon2.


Anmelden zum Antworten