[geloest] problem mit vererbung und templates error LNK2019



  • hi
    ich versuche grad nen simplen ressourcen manager zu schreiben und wollte dafür ne basisklasse haben und dann davon ableitungen für die jeweiligen ressourcen.

    ich versuch das ganze über templates zu machen und den jeweiligen typ dann erst im kind festzulegen.

    jetzt bekomme ich aber immer den fehler (VS2008)

    error LNK2019: unresolved external symbol "public: __thiscall jg::ResourceManager<class sf::Image>::ResourceManager<class sf::Image>(void)" (??0?$ResourceManager@VImage@sf@@@jg@@QAE@XZ) referenced in function "public: __thiscall jg::SFImageManager::SFImageManager(void)" (??0SFImageManager@jg@@QAE@XZ) SFImageManager.obj

    sieht mir stark nach nem problem mit der verwendung von templates aus. ich steig aber nicht durch.

    mein kopf sieht so aus

    template <class T> 
    	class ResourceManager : public Singleton<ResourceManager<T>>
    

    und

    class SFImageManager :
    		public ResourceManager<sf::Image>
    

    vielleicht reicht das schon, ansonsten hier den ganzen code (nicht viel).

    ResourceManager
    .hpp
    .cpp

    SFImageManager:ResourceManager
    .hpp
    .cpp

    Ist wahrscheinlich ein sehr grundlegender Fehler.. ich bin noch anfänger in cpp.

    jeden tipp nehme ich gerne an.

    danke schonmal für die hilfe

    mfg



  • Ist ein häufiges Problem bei Anfängern mit Templates, weil die Aufteilung in Header und Implementierung bei Templates nicht mehr wirklich klappt.

    Siehe hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-39467.html

    Felix



  • hmm jaa aber wenn ich die kind klasse auskommentiere, bekomm ich keinen fehler und nur die elternklasse ist ja ein template.

    ///edit
    ok das liegt wohl dadran das der fehler erst auftritt wenn man den header einbindet...

    ////edit
    ok, habs jetzt so gemacht
    #include "resourcemanager.inl"

    dennoch bekomm ich jetzt folgenden fehler:

    error LNK2001: unresolved external symbol "protected: virtual class sf::Image * __thiscall jg::ResourceManager<class sf::Image>::LoadDataProcedure(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?LoadDataProcedure@?ResourceManager@VImage@sf@@@jg@@MAEPAVImage@sf@@ABV?ResourceManager@VImage@sf@@@jg@@MAEPAVImage@sf@@ABV?basic_string@DU?chartraits@D@std@@V?char_traits@D@std@@V?allocator@D@2@@std@@@Z) SFImageManager.obj

    Ist es überhaupt möglich eine funktion abstrakt zu deklarieren

    protected:
    virtual T* LoadDataProcedure(const std::string &fileName);
    

    und in der ableitung zu erstellen?

    sf::Image* LoadDataProcedure(const std::string &fileName);
    

    /////edit
    ok vergesst es^^ ich sollte vielleicht immer vorher gucken wie man sowas macht.

    virtual T* LoadDataProcedure(const std::string &fileName)=0;
    

Anmelden zum Antworten