Templates und statische Bibliotheken



  • Hallo,

    ich habe folgendes Problem. Die folgenden beiden Klassen werden in eine statische Bibliothek kompiliert:

    template <typename T>
    class DataSet {
    
    public:
    
    	DataSet ( const void* const pvData, const EBlockDataType bdType, const unsigned int iDataBlocks, const bool bCopy = false );
    	virtual ~DataSet ();
    
    	void put_data ( const void* const pvData, const unsigned int iDataBlocks );
    
    	const T& get_block ( const unsigned int iPos );
    
    	// ...
    
    };
    
    class QBarChart {
    Q_OBJECT
    
    	// ...
    
    private:
    
    	DataSet<float> m_dataset;
    
    	// ...
    
    };
    

    In einem anderen Projekt binde ich die Bibliothek ein und bekomme beim Kompilieren (genaugenommen Linken) folgende Fehlermeldungen:

    /home/phate/.workspace/libvizgui-tools/../libvizgui/include/qbarchart.h:12: undefined reference to `DataSet<float>::~DataSet()'
    /home/phate/.workspace/libvizgui-tools/../libvizgui/include/qbarchart.h:12: undefined reference to `DataSet<float>::~DataSet()'
    ../libvizgui/lib/libvizgui.a(qbarchart.o): In function `QBarChart::paintEvent(QPaintEvent*)':
    /home/phate/.workspace/libvizgui/src/qbarchart.cpp:76: undefined reference to `DataSet<float>::get_block(unsigned int)'
    ../libvizgui/lib/libvizgui.a(qbarchart.o): In function `QBarChart::show_data(void const*, unsigned short)':
    /home/phate/.workspace/libvizgui/src/qbarchart.cpp:25: undefined reference to `DataSet<float>::put_data(void const*, unsigned int)'
    ../libvizgui/lib/libvizgui.a(qbarchart.o): In function `QBarChart':
    /home/phate/.workspace/libvizgui/src/qbarchart.cpp:17: undefined reference to `DataSet<float>::DataSet(void const*, EBlockDataType, unsigned int, bool)'
    /home/phate/.workspace/libvizgui/src/qbarchart.cpp:20: undefined reference to `DataSet<float>::~DataSet()'
    /home/phate/.workspace/libvizgui/src/qbarchart.cpp:17: undefined reference to `DataSet<float>::DataSet(void const*, EBlockDataType, unsigned int, bool)'
    /home/phate/.workspace/libvizgui/src/qbarchart.cpp:20: undefined reference to `DataSet<float>::~DataSet()'
    ../libvizgui/lib/libvizgui.a(moc_qbarchart.o): In function `~QBarChart':
    /home/phate/.workspace/libvizgui/obj/../include/qbarchart.h:12: undefined reference to `DataSet<float>::~DataSet()'
    /home/phate/.workspace/libvizgui/obj/../include/qbarchart.h:12: undefined reference to `DataSet<float>::~DataSet()'
    

    Weiß jemand Rat??


  • Mod

    the[V]oid schrieb:

    Die folgenden beiden Klassen werden in eine statische Bibliothek kompiliert

    DataSet ist kein Klasse, und das ist dein Problemm.



  • Tschuldigung mal, aber das sind Klassen, alleine ja schon am Schlüsselwort "class" zu erkennen. Wie würde es denn richtig aussehen?

    EDIT: Ah ich habe vergessen die Implementierungen der Klassen zu posten 😉 Aber an denen kann der Fehler ja eigentlich nicht liegen, denn die Bibliothek kompiliert fehlerfrei.



  • Hi Leute, weil ich grad die Templates sehe.
    Kann mir jemand vielleicht kurz den Sinn bzw. auch Anwendung von Templates erklaeren?
    Ein kurzes verstaendliches Beispiel waere auch super.
    Danke...



  • nyyrikki schrieb:

    Hi Leute, weil ich grad die Templates sehe.
    Kann mir jemand vielleicht kurz den Sinn bzw. auch Anwendung von Templates erklaeren?
    Ein kurzes verstaendliches Beispiel waere auch super.
    Danke...

    Google mal nach "generische Programmierung" und "c++"



  • the[V]oid schrieb:

    Google mal nach "generische Programmierung" und "c++"

    Oder er soll bitte ein eigenen Thread dafür öffnen. (Grundlegend vorher darüber kundig machen und dann konkretere Fragen stellen wäre aber grundsätzlich vorzuziehen).

    the[V]oid schrieb:

    Tschuldigung mal, aber das sind Klassen, alleine ja schon am Schlüsselwort "class" zu erkennen. Wie würde es denn richtig aussehen?

    Nein, Dataset ist tatsächlich keine Klasse. Sondern ein Template für Klassen.

    Da ich aber so gut wie nie mit exportierten Klassen zu tun hatte (u.a. wegen gemischter Compilerumgebung in der Firma), kann ich das folgende nicht zu 100% garantieren: Eine Bibliothek kann nur Elemente exportieren die vollständig definiert sind (Ein Template ist es nicht).

    cu André



  • asc schrieb:

    Eine Bibliothek kann nur Elemente exportieren die vollständig definiert sind (Ein Template ist es nicht).

    Ja da schließe ich mich dir an, aber DataSet (Klassentemplate) soll ja garnicht exportiert werden, sondern QBarChart (Klasse, innerhalb derer DataSet als DateSet<float> ja eindeutig definiert ist, oder? Sonst würde das ja wohl heißen, dass man in einer Bibliothek garkeine Klassentemplates benutzen kann)



  • edit: hat sich erledigt ^^



  • the[V]oid schrieb:

    edit: hat sich erledigt ^^

    Jetzt wäre natürlich interessant, zu wissen, wie.
    (gerade für alle, die sich bis hierhin in Dein Problem eingedacht ... oder die, die ein ähnliches Problem haben.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    the[V]oid schrieb:

    edit: hat sich erledigt ^^

    Jetzt wäre natürlich interessant, zu wissen, wie.
    (gerade für alle, die sich bis hierhin in Dein Problem eingedacht ... oder die, die ein ähnliches Problem haben.

    Gruß,

    Simon2.

    Bei Klassenvorlagen, die exportiert werden müssen, muss die Implementierung im Header stehen.



  • the[V]oid schrieb:

    ...Bei Klassenvorlagen, die exportiert werden müssen, muss die Implementierung im Header stehen.

    OK, Danke.

    Gruß,

    Simon2.


Anmelden zum Antworten