Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

14.09.2004, 14:44

Linkerfehler bei template-Klasse

Ich möchte aus einer statischen Dll eine template-Klasse laden. Jedoch erhalte ich einen Linkerfehler, wenn ich eine Funktion aus der Klasse aufrufe:

Dll.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <windows.h>

template<typename DATA,typename HANDLE> class EXPORT CHandle
{
public:
    CHandle();
   ~CHandle();

    void  Init(UINT uiID);
    void  Exit();

    ...
};


Dll.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#include "Dll.h"

template<typename DATA,typename HANDLE>
void CHandle<DATA,HANDLE>::Init(UINT uiID)
{
    ...
}
...


Exe.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#include <Dll.h>
struct tagTexture { };
typedef CHandle<tagTexture> HTexture;
void main()
{
    HTexture Tex1;
    Tex1.Init(1);
}



Bei Init ist nun der Linkerfehler. Muss ich irgendetwas bei der Funktion in Dll.cpp hinzufügen?

Heiko Kalista

Treue Seele

Beiträge: 99

Wohnort: Hessen

  • Private Nachricht senden

2

14.09.2004, 14:53

Hi!

Da es sich um eine Template-Klasse handelt, müssen sich die Funktionsdefinitionen und -deklarationen zusammen in der Header-Datei befinden. Ein Aufteilen in .h und .cpp ist nicht möglich.
Eine elegante Lösung besteht darin, Deine .cpp-Datei in .inl umzubenennen und am Ende der .h mit include einzubinden.

mfg,
Heiko

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

3

14.09.2004, 16:46

Hi,

was Heiko gesagt hat stimmt schon, am elegantesten ist es natürlich wenn man eine *.inl (inline-file) benutzt, aber bitte neben der C++ ;D (unterteilung sollte schon sein ;))

Desweiteren gibt es im Standard das Schlüsselwort export! Leider wird dies jedoch nicht von jedem X-Beliebigem Compiler unterstützt! Template mit export in 2 Dateien sähe dann so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// bar.h 

export template <class T> class bar
{ 
public: 
    void foo (void); 
    // [...]

}; 

// bar.cpp 

#include "bar.h" 

// [...]

template <class T> void bar::foo (void)
{
}


Mein VC++2003 unterstützt das, ob das jetzt auch dein Compiler unterstützt ist eine andere Geschichte ;)

- Patrick

Werbeanzeige