Template-Vererbungsproblem



  • Hi!

    Ich habe nach einer Lösung im Forum gesucht, aber leider nichts gefunden..
    Es geht um folgendes:

    //h
    template <class T>
    class manager
    {
    public: 
       manager(void) {}
       virtual ~manager(void) {}
    
       virtual void PushLoadLevel(void);
       virtual uint PopLoadLevel(void);
    
    protected:
       std::vector<T*> loaded;   
       std::stack<uint> load_level;
    };
    
    //cpp
    template <class T>
    void manager<T>::PushLoadLevel(void)
    {
       //code
    }
    //und PopLoadLevel()
    
    //andere datei
    #include "manager.h"
    
    namespace sfx
    {
    class system : public manager<media>
    {
    public:   
       ~system(void);
    
       static system& GetSystem(void)
       {
          static system sys;
          return sys;
       }
    
       void PushLoadLevel(void);
       uint PopLoadLevel(void);
    
    private:
       system(void);
    };
    }
    
    //cpp
    void system::PushLoadLevel(void)
    {
       manager<media>::PushLoadLevel();//<- fehler
    //anderer code
    }
    

    Wenn ich die Push/Pop-Sachen in eine neue Klasse packe und
    class manager von dieser Klasse ableite funzt alles.
    Aber wie geht das ohne den Umweg einer 3. Klasse?
    Mach ich vom Syntax her was falsch?

    [ Dieser Beitrag wurde am 25.06.2003 um 16:29 Uhr von Kane editiert. ]



  • So, mit Codetags gehts einfacher. Hat denn keiner ne' Idee?



  • Fehlermeldung bitte. 🙄



  • Wenn die Funktion virtuell ist:
    sfx_system.o:[ganze andere datei]:6: undefined reference to manager<sfx::media>::PushLoadLevel()' wenn nicht: undefined reference tomanagersfx::media::PushLoadLevel()'

    Compiler: gcc 3.2



  • static_cast<manager<media>*>(this)->PushLoadLevel();



  • so wie du es da machst kannst du nur static Methoden aufrufen.



  • Ok, mit static gehts (Thx), aber warum ist das so?



  • Weil du mit Klasse::Methode() nur statische Funktionen aufrufen kannst.
    machs lieber so:

    class base
    {
      doBasicStuff() { do basic work };
      virtual doSpecialStuff() { doBasicStuff(); do special stuff, nur wenn Objekt vom typ base ist;
    };
    class devired
    
      doBasicStuff() { do basic work };
      virtual doSpecialStuff() { doBasicStuff(); do special stuff, nur wenn Objekt vom typ devired ist;
    };
    

    [ Dieser Beitrag wurde am 25.06.2003 um 18:54 Uhr von Lars editiert. ]


Anmelden zum Antworten