JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=843637bf3bfce252f9d3b72ca1f138a5Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

template verursacht unaufgelösteste externe Verweise
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 22.08.2006, 19:53    Titel: template verursacht unaufgelösteste externe Verweise Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 22.08.2006, 21:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Maxim
Senior JLI'ler



Anmeldedatum: 28.03.2004
Beiträge: 249

Medaillen: Keine

BeitragVerfasst am: 22.08.2006, 21:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 23.08.2006, 03:48    Titel: Antworten mit Zitat

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);

Shocked


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 Confused


<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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 23.08.2006, 05:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 23.08.2006, 07:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 23.08.2006, 07:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 23.08.2006, 10:07    Titel: Antworten mit Zitat

Sind das auch Templates? Zeigmal die Definition.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 23.08.2006, 13:55    Titel: Antworten mit Zitat

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 Wink
(Oder hab ich dir jetzt unrecht getan und matrix und vector sind selbst definierte Klassen? Razz )
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 23.08.2006, 17:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 23.08.2006, 17:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 23.08.2006, 18:00    Titel: Antworten mit Zitat

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 Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 23.08.2006, 21:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 24.08.2006, 00:45    Titel: Antworten mit Zitat

Stimmt, danke GreveN. War ein bisschen blöd ausgedrückt Razz

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 Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 24.08.2006, 17:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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

Impressum