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 wirdWas 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 nurfinde_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
speicherdie Templateargumentliste angeben.speicher<int> maximum = finde_Maximum<speicher<int> >(*s1,*s2); // oder: speicher<int> maximum = finde_Maximum(*s1,*s2);Abgesehen davon solltest du mit
newangelegten Speicher wieder mitdeletefreigeben (weshalb machst du das überhaupt?) und den Vergleichsoperator eventuell global machen.
-
Nexus schrieb:
Du musst schon bei jedem Vorkommen von
speicherdie Templateargumentliste angeben.speicher<int> maximum = finde_Maximum<speicher<int> >(*s1,*s2); // oder: speicher<int> maximum = finde_Maximum(*s1,*s2);Abgesehen davon solltest du mit
newangelegten Speicher wieder mitdeletefreigeben (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 mitnewangelegten Speicher wieder mitdeletefreigeben (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.