Template Class wird nicht gelinkt?



  • Hallo folks, liebes Forum,

    ich arbeite derzeit an einer eigenen Array/Vector/Tabellen (wie jeder will ;)) Klasse, welche ich von einer sehr abstrakten (nicht abstrakt im C++ Sinne) Array Basis Klasse abgeleitet, und als Template deklariert habe:

    #define HZAPI _declspec( dllexport )
    
    template<class ElementType>
    class HZAPI hzTArray : public hzArray
    {
    public:
    	hzTArray( uint uiCount = 0 );
    	~hzTArray( void );
    
    	// ...
    };
    

    Mein Problem ist folgendes: Anders wie hzArray (selbe Datei und selbe Deklaration), wird hzTArray nicht in meine DLL gelinkt.
    Also woran kann dies liegen? Ist das HZAPI in diesem Falle einfach nur falsch gesetzt?

    Beste Grüße
    Sebastian "Ra2k" Zander



  • Die spezialisierung muss zur compilierzeit erfolgen - z.B. mit

    typedef  HZAPI hzTArray<int> hzTArrayInt;
    typedef  HZAPI hzTArray<float> hzTArrayFloat;
    

    koennen zaei Spezialisierungen erzeugt und exportiert werden. Das Template selbst leider nicht - das muesstest du in einen Header packen und den Header in der Zielanwendung mit reinziehen.



  • Das dürfte an der Template-Deklaration liegen - bei Templates muß der Compiler den Quellcode kennen, wenn er sie instanziiert (wenn du deine DLL zusammenbaust, weiß der Compiler nicht, ob du ein Array von int's, CString's oder Haustieren benötigen wird).



  • peterchen@road schrieb:

    typedef  HZAPI hzTArray<int> hzTArrayInt;
    typedef  HZAPI hzTArray<float> hzTArrayFloat;
    

    zu erst einmal danke @ peterchen für deine antwort.. nun ja, ich hab es gerade eben probiert, aber auch dies wird nicht verlinkt und die zielanwendung besitzt mehrere unaufgelößte verweise...

    ebenfalls danke an CStoll (hey, heißt du mit nachnamen Stoll? mein schwager jedenfalls auch *g*). also es gibt tatsächlich keine andere methode? templates sind also wirklich nur zur arbeitserleichterung geeignet, sprich wenn man sie direkt verwendet und der compiler sie kennt?

    ich meine, was müsste der compiler denn so wissen? eigentlich sind es doch auch nur bits und bytes, und die größe der template typs allein wäre ja nicht wirklich ein problem beim compiler... hmm 🙄

    Sebastian



  • Du musst einfach Dein ganzes Template in die H-Datei schreiben (also ohne CPP-Datei; alle Methode inline implementieren). Dann wird auch nichts benötigt was in eine DLL muss...



  • Der Compiler muß den tatsächlichen Quelltext deiner Template-Methode UND die verwendeten Template-Parameter bei der Anwendung kennen, um daraus lauffähigen Code zu bauen. Denn spätestens wenn der eingesetzte Typ irgendwelche Operatoren überlädt, sind das mehr als nur "Bits und Bytes". Und selbst wenn du nur mit Build-in Typen arbeitest, unterscheiden sich die eingesetzten Operationen voneinander.

    (PS: Ja, der Nickname ist eine Abkürzung meines Namens ;))



  • Man kann keine Templates exportieren, weil diese vor dem Linken aufgelöst werden und somit nie Bestandteil einer DLL werden können. Man kann Ausprägungen von Templates exportieren.
    Dies halte ich jedoch in den meisten Fällen für ungeschickt, da man sicherstellen muss, dass innerhalb der DLL, die exportiert alle erlaubten Ausprägungen vorgenommen werden.
    Exportiert man das Template nicht, kann eine Ausprägung des Templates mehrfach existieren (z.B. in 2 DLLs)! Also vorsicht bei statischen Variablen....


Anmelden zum Antworten