Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit Template

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
03.08.2005, 16:55 Uhr
venom



Hallo !


Habe mir eine Template Klasse geschrieben. Im Header habe ich :


C++:
template <class Real= double>
class TMatrix
{
  public :
    
  Real Matrix[16];

  TMatrix(void);

  ~TMatrix(void);

  void Unit(void);

  void Transpose4x4(void);
};




Und in der zugehörigen cpp habe ich :


C++:
template <class Real>
TMatrix<Real>::TMatrix(void)
{
}


template <class Real>
TMatrix<Real>::~TMatrix(void)
{
}


template <class Real>
void TMatrix<Real>::Unit(void)
{
}


template <class Real>
void TMatrix<Real>::Transpose4x4(void)
{
}




Wenn ich das compiliere gibt es 0 Fehler und 0 Warnings.
Aber wenn ich jetzt in einer anderen Klasse BLA im Header deklariere...

C++:
#include <TMatrix.h>

class BLA
{
  public :
  static TMatrix<>  MeineMatrix;
};


...und in der zugehörigen cpp...

C++:
TMatrix<> BLA::MeineMatrix;



Dann bekomm ich das hier hingeplättet :


Code:

error LNK2019: unresolved external symbol "public: __thiscall TMatrix<double>::TMatrix<double>(void)" (??0?$TMatrix@N@@QAE@XZ) referenced in function _$E47

error LNK2019: unresolved external symbol "public: __thiscall TMatrix<double>::~TMatrix<double>(void)" (??1?$TMatrix@N@@QAE@XZ) referenced in function _$E48




Wenn ich aber das static wegnehme gehts !

Weiß jemand was da los ist ?
Ich brauch das aber static !

Danke für jede Hilfe !

Dieser Post wurde am 03.08.2005 um 16:57 Uhr von venom editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.08.2005, 17:03 Uhr
Tommix



Hallo,
bei templates muß die Definition mit in den Header und nicht in eine extra cpp-Datei.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.08.2005, 17:07 Uhr
venom



Es geht ja wenn ich das static wegnehme. Template Klassen können
genauso in Header und cpp aufgeteilt werden wie normale Klassen.
Es ist wirklich nur dieses static das scheinbar Probleme macht,
ohne das static gehts einwandfrei zu compilieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.08.2005, 17:20 Uhr
Tommix




Zitat von venom:
Es geht ja wenn ich das static wegnehme.

Tja, und bei mir geht's, wenn ich die Implementierung mit den Header packe:


C++:
#include "TMatrix.h"

class BLA
{
  public :
  static TMatrix<>  MeineMatrix;
};

TMatrix<> BLA::MeineMatrix;

int main()
{
    BLA bla;
    return 0;
}



Zitat von Compiler:

Forum.exe - 0 Fehler, 1 Warnung(en)
warning C4101: 'bla' : Unreferenzierte lokale Variable



- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.08.2005, 17:32 Uhr
venom



BLA ist bei mir eine große Klasse mit vielen Attributen und Methoden
sauber aufgeteilt in header und cpp.

Wenn ich da jetzt die Implementierung TMatrix<> BLA::MeineMatrix;

mit in den Header packe statt zu den anderen Implementierungen in
der cpp dann bekomme ich :

error LNK2005: "public: static class TMatrix<double> BLA::MeineMatrix" (?MeineMatrix@BLA@@2V?$TMatrix@N@@A) already defined in Test.obj


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
03.08.2005, 17:57 Uhr
venom



Habe grade in einer PDF gelesen und herausgefunden
wo das Problem liegt und damit lösen können

Zitat:


Zitat von Verfasser:

Generische Klassen und Funktionen - Templates
Auftrennung in Header- und Implementierungsdatei:

Prinzipiell wie bei allen anderen Klassen auch.

Problem: Bei einer Auftrennung kann nicht jeder Compiler
automatisch die benötigten konkreten Klassen aus den Templates
erzeugen.

Lösung: Explizite Erzeugung der benötigten Template-Instanz
innerhalb der Implementierungsdatei durch den Entwickler.

Nachteil: Die Implementierungsdatei ist nicht mehr unabhängig
von der restlichen Anwendung.



Beispiel :

Header-Datei value.h

C++:
template <class type>
class Value {
type value;
public:
Value (){}
~Value (){}
type getValue();
void setValue(type nValue);
};



Implementierung value.cpp

C++:
#include "value.h"
template <class type>
type Value<type>::getValue(){
return value;
}
template <class type>
void Value<type>::setValue(
type nValue ){
value = nValue;
}
// Explizite Klassenerzeugung,
// da der Compiler dieses
// nicht kann -> Compiler-
// abhängig.
template class Value<int>;




Trotzdem Danke !

Gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.08.2005, 17:57 Uhr
virtual
Sexiest Bit alive
(Operator)


Templates sind keine Klassen und werden erst bei Benutzung instantiiert. Das bedeutet, daß alles in einem Header stehen muss.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.08.2005, 07:24 Uhr
~Tommix (wieso Gast)
Gast


'Morgen,

Zitat:

Lösung: Explizite Erzeugung der benötigten Template-Instanz
innerhalb der Implementierungsdatei durch den Entwickler.

Nachteil: Die Implementierungsdatei ist nicht mehr unabhängig
von der restlichen Anwendung.


Das führt die generische Programmierung weitgehend ad absurdum. Wenn Dir irgendwann in den Sinn kommt, eine Matrix aus komplexen Zahlen oder so zu benutzen, mußt Du den ursprünglichen TMatrix-Quelltext ändern - worauf alle Programme, die TMatrix benutzen, auch komplexe Zahlen kennen müssen, falls Du sie noch mal kompilieren willst usw. Das dürfte relativ schnell etwas unübersichtlich werden.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: