|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 22.08.2006, 19:53 Titel: template verursacht unaufgelösteste externe Verweise |
|
|
Ich hab ein kleines Problem mit einer Template Klasse. Die ist nicht furchtbar wild:
CPP: | template <class T>
class CEDLL CEColorARGB
{
public:
//constructors
CEColorARGB( T tr, T tg, T tb, T ta ) { ... Mach was... }
};
|
will ich jetzt diese Klasse nutzen, beispielsweise so:
CPP: | CEColorARGB<DWORD>(250,250,250,250);
|
gibts diese Fehlermeldung:
Code: | TestArea error LNK2019: Nicht aufgelöstes externes Symbol '"__declspec(dllimport) public: __thiscall CE::CEColorARGB<unsigned long>::CEColorARGB<unsigned long>(unsigned long,unsigned long,unsigned long,unsigned long)" (__imp_??0?$CEColorARGB@K@CE@@QAE@KKKK@Z)', verwiesen in Funktion '"public: enum EResult __thiscall MainScene::CreateScene(void)" (?CreateScene@MainScene@@QAE?AW4EResult@@XZ)' |
Hat jemand eine Idee woran das liegt!? _________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 22.08.2006, 21:11 Titel: |
|
|
Tja, das mit dem CEDLL versteh ich nciht ganz scheint irgendwas mit ner dll zu tun zu haben?
Auf jedne FAll sieht der Rest richtig aus, und der Linker Fehelr entsteht eigneilhc durch falsches einbinden. Also bräuchte man warhscheinlcih mal die komplette .h und .cpp Datei der Klasse, sowie den Code wie die Klasse in MainScene verwendet wird. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Maxim Senior JLI'ler
Anmeldedatum: 28.03.2004 Beiträge: 249
Medaillen: Keine
|
Verfasst am: 22.08.2006, 21:12 Titel: |
|
|
CPP: | CEColorARGB<DWORD>(250,250,250,250); |
eh?
du meinst sicher
CPP: | CEColorARGB instanz<DWORD>(250,250,250,250); |
Vielleicht liegt deine Klasse in cpp-Datei? Oder die Definition von CEDLL ist dorf, wo du die Klasse instanzierst, nicht vorhanden. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 23.08.2006, 03:48 Titel: |
|
|
Maxim hat Folgendes geschrieben: | CPP: | CEColorARGB<DWORD>(250,250,250,250); |
eh?
du meinst sicher
CPP: | CEColorARGB instanz<DWORD>(250,250,250,250); |
Vielleicht liegt deine Klasse in cpp-Datei? Oder die Definition von CEDLL ist dorf, wo du die Klasse instanzierst, nicht vorhanden. |
eh?
Ihr meint beide hoffentlich...
CPP: | CEColorARGB<DWORD> instanz(250,250,250,250); |
Hmm...könnte das was damit zu tun haben, dassman Klassen nicht ganz so einfach in DLLs exportieren kann, weil diese eigentlich reines C beinhalten? Ich meine mich zu erinnern, dass es bei template-Klassen da noch größere Probleme gibt
<edit>
Kann mich jetzt auch täuschen, aber muss das CEDLL nicht vor class?
</edit> _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 23.08.2006, 05:42 Titel: |
|
|
Hi!
Zitat: |
Kann mich jetzt auch täuschen, aber muss das CEDLL nicht vor class?
|
Nein, is genau richtig an dieser Stelle!
Nur können Templates nicht in Dll's exportiert werden... Daher kannst du dein 'CEDLL' ganz rausnehmen.
grüße |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 23.08.2006, 07:02 Titel: |
|
|
Ist ja eignetlich auch logisch, da ein Template doch für jeden Typ neu compiliert wird, oder? Daher kann das gar nicht gehen, da in einer dll alles vorkompiliert ist, und die dll ja nicht wissen kann, womit man das Template benutezn möchte. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 23.08.2006, 07:24 Titel: |
|
|
seltsamerweise geht es bei der matrix und vector funktion die genauso aufgebaut sind. Die funktionieren ohne die fehlermeldung und sind ebenfalls in der dll _________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 23.08.2006, 10:07 Titel: |
|
|
Sind das auch Templates? Zeigmal die Definition. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 23.08.2006, 13:55 Titel: |
|
|
schneidi74 hat Folgendes geschrieben: | seltsamerweise geht es bei der matrix und vector funktion die genauso aufgebaut sind. Die funktionieren ohne die fehlermeldung und sind ebenfalls in der dll |
Moment...es ist ein Unterschied, ob du eine Template-Klasse selbst oder eine Instanz davon in einer DLL exportierst. Sobald du instanzierst, musst du den Typ festlegen -> d.h. ein vector<int> myvector ist exportierbar. Ich bezweifle, dass du die komplette vector-Template-Klasse mal in einer DLL gesehen bzw. sie exportiert hast
(Oder hab ich dir jetzt unrecht getan und matrix und vector sind selbst definierte Klassen? ) _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 23.08.2006, 17:04 Titel: |
|
|
also ich check dat net so ganz...
Beispiel: ich hab meine Vector Klasse
CPP: | template <class T=float>
class CEDLL Vector3
{
public:
union {
struct {
T x, y, z;
};
T v[3];
};
//constructors
inline Vector3() {}
inline Vector3( T fX, T fY, T fZ ) : x(fX), y(fY), z(fZ) {}
inline Vector3( T f[3] ) : x(f[0]), y(f[1]), z(f[2]) {}
inline Vector3( const Vector3<>& vec ) : x(vec.x), y(vec.y), z(vec.z) {}
...
|
funktioniert einwandfrei in meinem hauptteil des Programms und befindet sich ebenfalls in der DLL.
CPP: | template <class T> class CEDLL ColorARGB
{
public:
//constructors
inline ColorARGB(T t)
{
MessageBox(0,"Test","Tst",MB_OK);
}
};
|
Nutze ich das hier kommt meine Fehlermeldung. Genauso aufgebaut wie die Vector klasse mal abgesehen von dem template<class T=float> aber auch damit funktioniert es nicht...
Wenn's mit dem einen geht, muss es mit dem anderen doch auch gehen.
Schreibe ich CE::Math::Vector3<>(0.0f,0.0f,0.0f); im Hauptteil erstelle ich genauso eine Instanz, als wenn ich ColorARGB<DWORD>(25); schreibe nur mit dem unterschied das es bei der color geschichte rappelt und beim vector nicht... also irgendwo fehlt mir da noch das verständnis... _________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 23.08.2006, 17:28 Titel: |
|
|
CPP: | template <class T=float>
|
Er nimmt float als Defaulttype und exportiert deinen Vektor als normale Klasse...
Wie auch immer, Templates lassen sich nicht in Dlls exportieren!
grüße |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 23.08.2006, 18:00 Titel: |
|
|
schneidi74 hat Folgendes geschrieben: | Schreibe ich CE::Math::Vector3<>(0.0f,0.0f,0.0f); im Hauptteil erstelle ich genauso eine Instanz, als wenn ich ColorARGB<DWORD>(25); schreibe nur mit dem unterschied das es bei der color geschichte rappelt und beim vector nicht... also irgendwo fehlt mir da noch das verständnis... |
Hmm...kannst du das ganze mal im Kontext zeigen? Muss nicht viel sein, nur damit man sieht, wie du das instanzieren&verwenden willst.
Was das Exportieren angeht, muss ich David zustimmen. Der Unterschied zwischen "normalem Code" und einer DLL liegt darin, dass die DLL eben vorkompiliert ist und der Code nicht. Weil Dynamik und Prekompilation nicht zusammenpassen, kannst du auch keine (dynamischen) Templates exportieren. Wenn du jetzt dem Template einen Defaulttype gibst, dann wäre das hier im Endeffekt das gleiche:
CPP: | typedef float T;
class CEDLL Vector3
{
public:
T blabla;
} |
Hier hat das Template, das du verwendest nichts mehr mit Dynamik zu tun _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 23.08.2006, 21:42 Titel: |
|
|
The Lord of Programming hat Folgendes geschrieben: | Der Unterschied zwischen "normalem Code" und einer DLL liegt darin, dass die DLL eben vorkompiliert ist und der Code nicht. |
Das stimmt so nicht ganz. Wie du es ausdrückst, klingt es, als wenn die Templates zur Laufzeit übersetzt werden, das ist aber nicht der Fall, Templates sind statisch und die jeweiligen Typen werden zum Zeitpunkt des Kompilierens aus den Templates erzeugt.
Es ist ziemlich blöd, dass immer von "Template-Klasse" gesprochen wird, das assoziiert, dass das Template selbst eine Klasse bzw. ein Typ ist, das ist aber nicht richtig. Ein Template ist einfach nur eine Schablone für Typen, nicht mehr und nicht weniger.
CPP: | template<class T>
class foo
{
...
};
foo bar; // Fehler! "foo" ist kein Typ!
foo<int> bar; // Korrekt! "foo<int>" ist ein Typ, der durch das Template "foo" generiert wurde. |
|
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 24.08.2006, 00:45 Titel: |
|
|
Stimmt, danke GreveN. War ein bisschen blöd ausgedrückt
Man kanns aber so ausdrücken, dass du im "normalen" Code noch die dynamische Freiheit hast, den Typen des Templates zu ändern, bevor du deine Exe erstellst. Wenn du eine DLL vorliegen hast, kannst du darin nicht mehr herumwursteln, im Code schon. Nach dem kompilieren des Codes natürlich auch nicht mehr _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 24.08.2006, 17:45 Titel: |
|
|
The Lord of Programming hat Folgendes geschrieben: | Hmm...kannst du das ganze mal im Kontext zeigen? Muss nicht viel sein, nur damit man sieht, wie du das instanzieren&verwenden willst.
|
Also für das ColorARGB nutze ich das so:
CPP: | CE::Core::RenderSystem::GetInstancePtr()->SetAmbientLight( ColorARGB<DWORD>(25,25,25) ); |
den Vector Beispielsweise nutze ich so:
CPP: | CE::Graphic::SCEVertex3D sVertices[3];
sVertices[0] = CE::Graphic::SCEVertex3D( CE::Math::Vector3<>(0.0f, 1.0f,0.0f),
CE::Math::Vector3<>(0.0f,0.0f,-1.0f),
0xff0000, 0.5f,0.0f ); |
oder auch mal so:
CPP: | _snCustom->SetPosition( CE::Math::Vector3<>(5.0f,0.0f,-0.0f), false); |
_________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|