Templates und operatoren überladen
-
Hallo,
Ich habe folgendes Problem: Wenn ich in meinem Programm operatoren überladen will, sträubt sich das Programm dagegen ^^
Woran kann das liegen?dekl
#include <conio.h> #include <iostream.h> template <class T> class Kset { private: struct Knoten { int Inhalt; Knoten *pNext; }; int Anzahl; Knoten *pFirst; Knoten *pLast; public: Kset(); //Kset(const Kset &obj); //Kset &Kset::verein(const Kset &obj); //Kset(const int *obj, const int Array); ~Kset(); void insert_front(int obj); //void insert_back(int obj); //void insert_position(int obj, int pos); //void delete_front(); //void delete_back(); //void delete_pos(int pos); //void view_first(); //void view_last(); //void view_all(); //int view_position(int pos); //bool member_of_list(int obj); //void push_array(const int *obj, const int Array); //void clear_List(); //int get_nachfolger(int obj); //int get_kleinstes_element(); //int get_groesstes_element(); //void get_mittelwert(); //int get_anzahl(); friend ostream& operator << (ostream&, const Kset<T> &); //friend istream& operator >> (istream&, const Kset<T> &); }; #include "impl0000.hpp"impl
//Konstruktor/////////////////////////////////////////////////////////////////// template <class T> Kset<T>::Kset() { Anzahl = 0; pFirst = pLast = NULL; } //Dekonstruktor///////////////////////////////////////////////////////////////// template <class T> Kset<T>::~Kset() { Knoten *ptemp = pFirst; for(; Anzahl>0;) { pFirst = pFirst->pNext; delete ptemp; ptemp = pFirst; Anzahl--; } } //insert_front////////////////////////////////////////////////////////////////// template <class T> void Kset<T>::insert_front(int obj) { if(Anzahl == 0) { pFirst = new Knoten; pFirst->Inhalt = obj; pFirst->pNext = NULL; pLast = pFirst; } else { Knoten *pNew = new Knoten; pNew->Inhalt = obj; pNew->pNext = pFirst; pFirst = pNew; } Anzahl++; } //Überladen << Ausgabeoperator template <class T> ostream & operator << (ostream&, const Kset<T> &) { Kset::Knoten *ptemp = kl.pFirst; for(int anz = kl.Anzahl; anz != 0; anz--) { cout<<ptemp->Inhalt<<" "; ptemp = ptemp->pNext; } cout<<endl; return os; }main
Kset <int> k; //vorne einfügen k.insert_front(1); k.insert_front(2); k.insert_front(3); cout<<k;bei cout<<k sagt er mir was von wegen linkerfehler ...
-
hi,
mach aus deinem friend:
template<typename U> friend ostream& operator << (ostream&, const Kset<U> &);Dann sollte das gehen

-
danke - aber es will nicht *heul*
-
Wie wäre es mit Fehlermeldungen? So können wir auch nur raten.
BR
-
//Es sieht so aus, als hättest du die Namen der Argumente vergessen! template <class T> ostream & operator << (ostream&, const Kset<T> &) { Kset::Knoten *ptemp = kl.pFirst; for(int anz = kl.Anzahl; anz != 0; anz--) { //hier willst du wahrscheinlich nicht den ostream cout, sondern den mit dem nichtgefundenen namen benutzen cout<<ptemp->Inhalt<<" "; ptemp = ptemp->pNext; } //auch hier nicht cout, sondern den den ostream-Parameter mit dem nichtgefundenen namen cout<<endl; return os;//hier den ostream-Parameter mit dem nichtgefundenen namen zurückgeben }
-
hab das jetzt mal verändert ...
ostream & operator << (ostream &os, Kset & kl) { Kset::Knoten *ptemp = kl.pFirst; for(int anz = kl.Anzahl; anz != 0; anz--) { cout<<ptemp->Inhalt<<" "; ptemp = ptemp->pNext; } cout<<endl; return os; }aber es will net ...
-
Wie wäre es mit Fehlermeldungen?
-
Du solltest cout auch mit os ersetzen damit das ganze hier überhaupt sinn macht.
ostream & operator << (ostream &os, Kset & kl) { Kset::Knoten *ptemp = kl.pFirst; for(int anz = kl.Anzahl; anz != 0; anz--) { os<<ptemp->Inhalt<<" "; ptemp = ptemp->pNext; } os<<endl; return os; }Edit: Fehlermeldungen zeigen! Die 3.
-
Jetzt solltest du nur noch dein cout durch deinen angelegten ostream& os ersetzen, dann sollte es auch funktionieren

-
1. Wieso cout << ... und nicht os << ...?
2. Wieso plötzlich Kset &kl und nicht mehr const Kset &kl?
-
Also ... Fehlermeldung wie oben schon gesagt:
Linkerfehler ...
[Linker Fehler] Unresolved external '_STL::basic_ostream<char, _STL::char_traits<char> >& operator <<(_STL::basic_ostream<char, _STL::char_traits<char> >&, const Kset<int>)' referenced from C:\LISTE2\TEMPLATE2\MAIN_T.OBJ
-
schorsch code schrieb:
2. Wieso plötzlich Kset &kl und nicht mehr const Kset &kl?
Stimmt ist mir grad gar net aufgefallen. Aber er ist selber Schuld wenn er net mit Fehlermeldungen kommt

BR
-
template<typename T> class Kset{ // ... template<typename U> friend std::ostream & operator<<(std::ostream &, Kset<U> const &); }; // in impl template<typename U> std::ostream & operator<<(std::ostream & os, Kset<U> const & ks){ typename Kset<U>::Knoten *ptemp = kl.pFirst; for(int anz = kl.Anzahl; anz != 0; anz--){ os << ptemp->Inhalt << " "; ptemp = ptemp->pNext; } os << std::endl; return os; }