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

27.02.2004, 12:39

Nicht aufg. externes Symbol bei Template Klasse

Hallo,

ich habe ein Problem mit der bekannten Linker Meldung, dass es ein nicht aufgelöstes externes Symbol gibt.

Ich habe folgende Klasse in einer extra Datei:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename _type>
class CListElement
{
  private:

  public:
    CListElement();
    CListElement(_type value);
    ~CListElement();

    _type iValue;
    CListElement* pNext;
};


Die Implementierung des Konstruktor sieht z.B. so aus:

Quellcode

1
2
3
4
5
template <typename _type>
CListElement<_type>::CListElement()
{
    pNext = 0;
}


Wenn ich nun die Template Klasse ausprägen will, in der main funktion z.B. folgendes mache:

Quellcode

1
CListElement<int> elem;


kommt dieser Fehler:

VerketteteListe error LNK2019: Nicht aufgeloestes externes Symbol "public: __thiscall CListElement<int>::~CListElement<int>(void)" (??1?$CListElement@H@@QAE@XZ), verwiesen in Funktion _main

sowie:

VerketteteListe error LNK2019: Nicht aufgeloestes externes Symbol "public: __thiscall CListElement<int>::CListElement<int>(void)" (??0?$CListElement@H@@QAE@XZ), verwiesen in Funktion _main

(also einmal für den Konstruktor und einmal für den Dekonstruktor)

Die Header Datei habe ich korrekt in die main-datei eingebunden. Ich weiss einfach nicht, warum diese Linker Meldung kommt, und ich hoffe Ihr könnt mir weiterhelfen.

Vielen Dank


MfG,
Timo

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

27.02.2004, 14:30

Hi,

1. ein GANZ großes "Schäm Dich!!!" an dich ;) Du hast geschrieben _type, das ist illegal! Nur Compilerbauer und OS Coder dürfen den _ und __ benutzen!

2. Ja du hast nen Default constructor implementiert, aber wo ist dieser implementiert? CListElement(_type value); sowie der Destructor?

Achja, Templates dürfen NUR in Headern implementiert werden, du kannst also nur im header die templatefunktionen einbauen!

Anonymous

unregistriert

3

27.02.2004, 15:56

Zu 1.: upsala :) ich programmiere noch nicht so lange in C++, solche Richtlinien sind mir daher noch nicht so bakannt, ich korrigiere es auch gleich :-)
Kurze Frage: ist es denn nur eine Richtlinie, oder etwas, womit der Compiler nicht klarkommt?

Zu 2.: ich habe 2 Dateien, einmal die Header und einmal die normale cpp Datei. In der Header Datei ist die Template Klasse deklariert, in der normalen cpp Datei implementiere ich die ganzen Funktionen, auch den default Konstruktor - ist das der Fehler? Dürfen Funktionen von Template Klassen -nur- in Hedaer Dateien implementiert werden, oder trifft dies nur auf den Konstruktor zu?

Danke für Deine Hilfe


Beste Grüsse,
Timo

4

27.02.2004, 16:09

@One:
Ist nur eine Richtlinie ;)

@Two:
Genau das ist der Fehler. Implementierung und Deklaration sollten immer in der gleichen Datei sein (Header oder Modul ist dabei egal). Was nicht geht ist, das du in der Header die Deklaration machst und dann in einem extra Modul die Implementierung schreibst.
Das geht deshalb nicht, weil der Compiler die entgültige Klasse ja erst dann erzeugen kann, wenn genau feststeht welche Datentypen denn verwendet werden sollen. Da der Compiler jedes Modul einzeln Kompiliert, erzeugt er somit auch kein fertiges Template, da in diesem Modul keine Instanziierung vorgenommen wurde. Somit findet der Linker dann auch keine Methoden.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

5

28.02.2004, 03:16

Vielen Dank für die Hilfe und die gute Aufklärung :-)

Jetzt klappt alles bestens...


Gruß,
Timo

Werbeanzeige