Template Klasse => undefined reference to 'tad::Catalog<tad::Item>::add(tad::Item*)'



  • Hallo zusammen,

    ich versuche gerade eine generische Klasse zu schreiben, aber komme an dieser Stelle nicht weiter. Ich hab schon zig Varianten probiert und im web gesucht, aber die Lösung ist mir bisher nicht erschienen.

    //catalog.h
    
    #include <unordered_map>
    #include <memory>
    #include "object.h"
    
    namespace tad
    {
    
    template<class T> class Catalog
    {
        public:
            Catalog() {};
            void add(T* object);
            T* find(ulong id) const;
        private:
            std::unordered_map<long, std::unique_ptr<T>> map;
    };
    
    //catalog.cpp
    
    #include "catalog.h"
    
    template<class T> void tad::Catalog<T>::add(T* object)
    {
        map.insert({dynamic_cast<tad::Object>(object).getId(), std::unique_ptr<T>(object)});
    }
    
    template<class T> T* tad::Catalog<T>::find(ulong id) const
    {
        map[id]->get();
    }
    
    // main
    
        Item i2 {"Hallo"}; // Funktioniert!
    
        Catalog<Item> catalog; // Edit: {} entfernt!
        catalog.add(new Item {"Rostiges Messer"}); // Fehler!
    }
    

    Object und Item habe ich erst mal weggelassen, aber Item erbt von Object.

    Über einen kleinen Hinweise wäre ich dankbar.

    Gruß,
    temi



  • Templates werden nur im Header implementiert.



  • Danke, das hat funktioniert.



  • manni66 schrieb:

    Templates werden nur im Header implementiert.

    Ist aber nicht sehr konsequent, oder?

    Da wird ein Aufriss mit Trennung von Definition und Implementation in .h und .cpp gemacht und dann nicht konsequent durchgezogen. Hat das einen bestimmten Grund oder ist C++ ganz einfach eine Zicke?



  • temi schrieb:

    manni66 schrieb:

    Templates werden nur im Header implementiert.

    Ist aber nicht sehr konsequent, oder?

    Da wird ein Aufriss mit Trennung von Definition und Implementation in .h und .cpp gemacht und dann nicht konsequent durchgezogen. Hat das einen bestimmten Grund oder ist C++ ganz einfach eine Zicke?

    Templates sind, wie der Name schon sagt nur "Schablonen".
    Erst wenn ein Template verwendet (aka instanziiert wird) wird z.b. std::vector<int> bei einem klassen template, wird daraus ein konkrete klasse.
    Hierfür muss der Compiler die komplette "Implementierung" des templates zum Zeitpunkt der Instanziierung kennen.
    Deshalb kann man teile von templates nicht in eine .cpp datei packen.


Anmelden zum Antworten