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

1

30.07.2003, 18:06

templateproblem

Wieso funktioniert das nicht. (Hab noch nicht viel Ahnung von Templates)

Prototyp

Quellcode

1
2
template<class T> FEExport FEResult FESafeRelease(T **PointerToRelease); //Führt ein sicheres
                                                                         //Release aus


Definition

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//***************************************************************************************
//Führt ein sicheres Realese aus
template<class T> FEExport FEResult FESafeRelease(T **PointerToRelease)
{
    if(*PointerToRelease != NULL)
    {
        *PointerToRelease->Release();
        PointerToRelease = NULL;
    }
    else
        return FEError;

    return FEOk;
}
//***************************************************************************************


Fehler:
FEDirect3D.obj : error LNK2001: Nichtaufgeloestes externes Symbol "enum FEResult __cdecl FESafeRelease(struct IDirect3DDevice9 * *)" (?FESafeRelease@@YA?AW4FEResult@@PAPAUIDirect3DDevice9@@@Z)
FEDirect3D.obj : error LNK2001: Nichtaufgeloestes externes Symbol "enum FEResult __cdecl FESafeRelease(struct IDirect3D9 * *)" (?FESafeRelease@@YA?AW4FEResult@@PAPAUIDirect3D9@@@Z)
Debug/FireEagleD.dll : fatal error LNK1120: 2 unaufgeloeste externe Verweise

Wenn ich das mit den Templates weglasse und ne einfache Gunktion drauß mache funktioniert alles.
Ein Gespenst geht um in Europa...

2

01.08.2003, 16:45

Ich nehme an das du die Definition in eine cpp geschrieben hast. Das kann nicht klappen, da ein Funktionstemplate erst dann zu einer echten Funktion wird, wenn man dem Templateparameter einen Komkreten Typ angibt.

Quellcode

1
2
// Also z.B. so
SafeRelease(&g_pD3DDevice);
Der Typ für den Templateparameter ist dann IDirect3DDevice9*. Der Compiler erstellt dann eine Funktion die so aussieht

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
FEExport FEResult FESafeRelease(IDirect3DDevice9**PointerToRelease) 
{ 
   if(*PointerToRelease != NULL) 
   { 
      *PointerToRelease->Release(); 
      PointerToRelease = NULL; 
   } 
   else 
      return FEError; 

   return FEOk; 
}
Damit der Compiler das auch machen kann, muss er die Definition haben. Daher müssen templates immer in einer Header Definiert werden. Das liegt einfach daran das jede cpp Datei für sich Kompiliert wird. Ein Prototyp ist daher auch nett unbedingt nötig.

PS: Mir ist da grad ein kleiner Fehler aufgefallen. Es soll doch bestimmt heißen *PointerToRelease = NULL und nicht PointerToRelease = NULL.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D