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;
    }
    

Anmelden zum Antworten