Template, welcher Typ?
-
Hallo,
ich habe eine Stack Klasse und eine Summen-Funktion, beides templates. Leider komme ich nun mit den Typ-Bezeichnern (allgemeint T) durcheinander :xmas1:
//Stack Klasse template<typename T> class MyStack { private: struct Node{ T value; Node *next; //nur ein Zeiger auf Node }; public: Node* p; //Zeiger auf Top-Node/Anker class Iterator{ public: Node* element; //Zeiger auf Node T operator*() {return element->value;} Iterator & operator ++(int) {element=element.next; return *this;} }; Iterator begin(){Iterator beg; beg.element = p; return beg;} Iterator end(){Iterator e = NULL; return e;} }; //Summen Funktion template<typename T> void summe(T* first) { T summe = 0; for(T* p=first; p != 0; ++p) summe += *p;Der Typ in summe müsste der gleiche Typ wie vom Stack sein, oder?
Bin mir unsicher

-
Der Templateparameter ist lokal für die darauf folgende Deklaration. Daher besteht keinerlei Zusammenhang zwischen dem T in summe und dem T in MyStack. Du kannst ja mal die Zeile 25 ändern zu:
template<typename ballaballapingpong>
Daraufhin wirst du allerlei Fehler bekommen an den Stellen wo T in summe auftaucht.
-
Hi Sepp,
danke für deine Antwort. Ich habe das Problem vielleicht nicht deutlich gemacht.
Wenn ich in main() ein Exemplar z.B. vom Typ MyStack<int> A definiere und im Verlauf die Summe aller Listenelemente benötige, dann rufe ich summe<int>(A.begin()) oder summe<Iterator>(A.begin()) oder auf?
Auf der einen Seite brauche ich Iterator p zum durchlaufen der Liste, auf der anderen Seite muss die lokale Variable summe den gleichen typ wie die Variable value in Struct Node haben.
-
Dein Iterator-Konzept ist nicht ganz stimmig. Erst sieht es so aus, als ob Du etwas STL-kompatibles bauen willst, aber Deiner summiere-Funktion übergibst Du nur einen einzigen Iterator, und dann auch noch einen, der nichts mit Deinem List-Iterator zu tun haben kann; denn Deine summiere-Funktion bekommt ja nur einen einfachen Zeiger.
Du darfst auch ruhig zwei Template-Parameter für deine Familie von summiere-Funktionen verwenden:
template<class T, class Iter> T summiere(Iter von, Iter bis); ... List<int> lst; ... int summe = summiere<int>(lst.begin(),lst.end());...zumindest für den Anfang...