Template-Klassen + überladene Operatoren



  • Hallo,

    ich hab ein Problem mit dem überladen von Operatoren in Template Klassen - speziell mit den Eingabe- und Ausgabeoperatoren
    Es kommen Fehlermeldungen, dass angeblich in der Zeile 29 und 30 ein Semikolon bzw. eine Klammer fehlen würde?!
    Könnt ihr mir helfen?

    dekl.h

    #ifndef KSet_h
    #define KSet_h
    ////////////////////////////////////////////////////////////////////////////////
    #include <iostream.h>
    #include <conio.h>
    
    template <class T>
    class Kset
    {
    private:
            struct Knoten
            {
             Knoten *pNext;
             T Inhalt;
            };
    
            int Anzahl;
            Knoten* pFirst;
    
    public:
            Kset();
            ~Kset();
    
            void insert_front(T obj);
            void display();
    
            //Kset<T>& operator=(const Kset<T>&);
            friend ostream& operator<< (ostream& ,const KSet<T> & );
            friend istream& operator>> (istream& ,const KSet<T> & );
    };
    
    //----------------------------------------------------------------------------
    #endif
    #include "impl.hpp"
    


  • Erstmal solltest du lieber <iostream> includen (ohne .h) und die Stream-Klassen mit std:: kennzeichnen. Zweitens wirst du nicht viel Freude an deinem op>> haben, wenn du dem ein konstantes Objekt übergeben willst.



  • okay ... dann so:

    #ifndef KSet_h
    #define KSet_h
    ////////////////////////////////////////////////////////////////////////////////
    #include <iostream>
    #include <conio>
    
    template <class T>
    class Kset
    {
    private:
            struct Knoten
            {
             Knoten *pNext;
             T Inhalt;
            };
    
            int Anzahl;
            Knoten* pFirst;
    
    public:
            Kset();
            ~Kset();
    
            void insert_front(T obj);
            void display();
    
            //Kset<T>& operator=(const Kset<T>&);
            friend ostream& operator<< (ostream& ,KSet<T> & );
            friend istream& operator>> (istream& ,KSet<T> & );
    };
    
    //----------------------------------------------------------------------------
    #endif
    #include "impl.hpp"
    

    es will aber immer noch nicht ...



  • Die solltest dich schon derauf festlegen, ob du Kset oder KSet schreiben willst.



  • mhhh ... da ist irgendwas falsch gelaufen ... in meinem Quelltext sind "Kset" alle gleich geschrieben ...



  • *g* <conio.h> ist kein Standard-Header - dort ist die Endung noch notwendig (wobei, für deine Deklaration brauchst du es nicht einmal). Und dann heißt es "std::istream" bzw. "std::ostream".



  • okili ... dann mit .h ^^

    aber das ist ja jetzt gerade nicht das problem ... sondern eher das oben beschriebene ^^



  • OMG 😃 sind ir jetzt schon so beschaeftigt die Kleinigkeiten zu verbessern dass wir das tatsaechliche Problem einfach ignorieren? 😃

    Vielleicht hilft dir folgender Link auf die Spruenge:

    http://www.digitalmars.com/archives/cplusplus/2126.html


  • Mod

    Blue-Tiger schrieb:

    OMG 😃 sind ir jetzt schon so beschaeftigt die Kleinigkeiten zu verbessern dass wir das tatsaechliche Problem einfach ignorieren? 😃

    Vielleicht hilft dir folgender Link auf die Spruenge:

    http://www.digitalmars.com/archives/cplusplus/2126.html

    das ist allerdings - bezoigen auf die fehlermeldungen und den code, der gepostet wurde - nicht das problem (im prinzip nat. schon, sonst müssten ja für alle T, die gebraucht werden, übherladungen geschrieben werden). das problem ist einfach die fehlende qualifikation von ostream und istream mit std::, bzw. das sichtbarmachen dieser bezeichner mittels using (die fehlermeldung ist typisch dafür, dass der bezeichner unbekannt ist),



  • camper schrieb:

    Blue-Tiger schrieb:

    OMG 😃 sind ir jetzt schon so beschaeftigt die Kleinigkeiten zu verbessern dass wir das tatsaechliche Problem einfach ignorieren? 😃

    Vielleicht hilft dir folgender Link auf die Spruenge:

    http://www.digitalmars.com/archives/cplusplus/2126.html

    das ist allerdings - bezoigen auf die fehlermeldungen und den code, der gepostet wurde - nicht das problem (im prinzip nat. schon, sonst müssten ja für alle T, die gebraucht werden, übherladungen geschrieben werden). das problem ist einfach die fehlende qualifikation von ostream und istream mit std::, bzw. das sichtbarmachen dieser bezeichner mittels using (die fehlermeldung ist typisch dafür, dass der bezeichner unbekannt ist),

    Im ursprungsquellcode wurde <iostream.h> verwendet, der Fehler waere also gar nicht aufgetreten, wenn es an fehlenden "std" gelegen haette 😉
    Andererseits hatte ein Studienkolleg von mir eben das selbe Problem (und hat mich genau deswegen auf diesen Thread hier aufmerksam gemacht), und da lies sich das Problem wie im Link angegeben loesen.


  • Mod

    interessanterweise ist auch in dem link nicht gerade die lösung gezeigt worden, die man erwartet: wir wollen ja für jedes T die betreefende instanz der funktions als friend der entsprechenden template klasse machen. im link wird nur gezeigt, wie wir alle instanzen des funktionstemplates frined jeder instanz des klassentemplates machen (nicht wirklich ein problem, aber allgemeiner als sinnvoll).

    template <class T> class A;
    
    template <class U> void fn(A<U>& a);
    
    template <class T> class A {
        int i;
        template <class U> friend void fn(A<U>& a); // jede instanz von fn
        template <> friend void fn<T>(A& a); // nur die instanz mit gleichem template parameter (und nur hierfür brauchen wir die vorwärtsdeklaration)
    };
    

Anmelden zum Antworten