static Member und Template



  • Hallo, habe folgendes Problem
    ich muss für eine interne scriptengine eine Liste mit allen Methoden namen bestimmter Klassen mitführen. Dazu wollte ich ursprünglich eine static list/vector etc. benutzen, hab dann aber festgestellt, dass sich die vererbten Klassen mit der Elternklasse eine Variable teilen. Also wollte ich daraus ein Template machen, in etwa so (rudimentär, die Variable heißt hier test und ist ein int):

    //Base.h
    template<class T>
    class Base
    {
    public:
    	Base(void);
    	~Base(void);
    
    	static int test;
    };
    
    //Base.cpp
    #include "Base.h"
    
    template<class T>
    Base<T>::Base(void)
    {
    }
    
    template<class T>
    Base<T>::~Base(void)
    {
    }
    
    template<class T>
    int Base<T>::test = 0;
    
    //derived.h
    #include "Base.h"
    
    class derived : public Base<derived>
    {
    public:
    	derived(void);
    	~derived(void);
    };
    
    //derived.cpp
    #include "derived.h"
    
    derived::derived(void)
    {
    }
    
    derived::~derived(void)
    {
    }
    

    Nun bekomme ich Linkerfehler:

    Fehler	1	error LNK2001: Nicht aufgelöstes externes Symbol ""public: static int Base<class derived>::test" (?test@?$Base@Vderived@@@@2HA)".	Statics_vererben2.obj
    

    Nach lesen der FAQ hier auf der Seite hab ich versucht an die Base.cpp noch ein

    #include "Base.cpp"
    

    anzuhängen, dann gehts!
    Aber:
    Wenn ich jetzt auf Projekt,bereinigen gehe, kommen beim nächsten Kompilieren die fehler

    Fehler	1	error C2995: "Base<T>::Base(void)": Funktionsvorlage wurde bereits definiert.	c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\statics_vererben2\statics_vererben2\base.cpp	6	
    
    Fehler	2	error C2995: "Base<T>::~Base(void)": Funktionsvorlage wurde bereits definiert.	c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\statics_vererben2\statics_vererben2\base.cpp	11	
    
    Fehler	3	error C2086: 'int Base<T>::test': Neudefinition	c:\dokumente und einstellungen\administrator\eigene dateien\visual studio 2005\projects\statics_vererben2\statics_vererben2\base.cpp	14
    

    Ich hab leider keine ahnung wie ich das unterbinden kann 😕
    Das ganze sollte natürlich standardkonform sein (bzw muss unter vs2005 und gcc kompilieren)

    Mit freundlichen Grüßen
    Mene



  • ne sowas kannst de nicht machen(cpp-files includieren 😉 )...

    #if !defined(BASE_H__INCLUDED)
    #define BASE_H__INCLUDED
    
    template<class T>
    
    class Base
    {
    public:
        Base() {}
        ~Base() {}
    
    private:
        static int m_test;
    };
    
    template<class T>
    Base<T>::m_test = 0;
    
    #endif
    

    Also komplett in den Header .. dann sollte das gehen.



  • Hab jetzt die standardprozedur aus den headern auf die cpp angewandt, also:

    #include "Base.h"
    
    #if !defined(BASE_CPP__INCLUDED)
    #define BASE_CPP__INCLUDED
    
    template<class T>
    Base<T>::Base(void)
    {
    }
    
    template<class T>
    Base<T>::~Base(void)
    {
    }
    
    template<class T>
    int Base<T>::test = 0;
    
    #endif
    

    find ich persönlich schöner als alles in eine datei und klappt jetz ohne probleme 😉



  • Du scheinst aber keine Ahnung zu haben was die #if's und #endif's machen ... bzw wie man sie in diesem speziellen Fall nennt.
    Auch von wegen Templates hast du scheinbar noch nen paar Lücken ... lies dir mal anständige Bücher dazu durch. SRy


Anmelden zum Antworten