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

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

1

24.11.2009, 22:28

Probleme mit Template-Klassen

Hi Leute,

ich arbeite beriets seit längerem an einem Project für die Schule, nun wollte ich eine Klasse auf auf templates umstellen und auf einmal meine mein Compiler (VC++08) es gäbe nicht aufgelöste verweise auf extern (hat er vorher nicht gemacht). Nach stundemlangem radlosen suchen woran es liegt habe ich mich entschieden zum Spaß ein paar Tuts zu testen und nicht einmal diese sind lauffähig.

Hat jemand eine Idee woran es liegen könnte ?

<tut.h>

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once

template <class T>
class Stack {
    private:
        T* inhalt;
        int index;
        int size;
    public:
        Stack(int s);
        void push(T item);
        T top() const;
        void pop();
};

<tut.cpp>

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "tut.h"

template <class T>
Stack<T>::Stack(int s):index(-1),size(s)
{
    inhalt = new T[size];
}
template <class T>
void Stack<T>::push(T item) {
    if(index<size) {inhalt[++index]=item;}
}
template <class T>
T Stack<T>::top() const {
    if (index>=0) {return inhalt[index];}
}
template <class T>
void Stack<T>::pop() {
    if (index >= 0) {index--;}
}

<main.cpp>

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include "tut.h"

using namespace std;

int main()
{
    Stack<int> t(10);
    cin.get();
    return 0;
}


Fehler:

Quellcode

1
2
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Stack<int>::Stack<int>(int)" (??0?$Stack@H@@QAE@H@Z)" in Funktion "_main".
1>C:\Users\Zeus\Documents\Visual Studio 2008\Projects\test\Debug\test.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.


Gruß Zeus

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

24.11.2009, 22:41

Du kannst die Implementierung eines template nicht in ein separates .cpp file packen (dazu bräuchtest du das export Schlüsselwort was von praktisch keinem Compiler unterstützt wird). Du musst deine Methoden im Header implementieren.

3

24.11.2009, 22:44

Weder "taplate" noch "tamplate". Im Code hast du es ja auch richtig geschrieben... :p

Zum Problem: Templates solltest du in Headern definieren, wenn du sie nicht nur lokal in der gleichen Implementierungsdatei instanziierst. Eine Deklaration reicht dem Compiler nicht, da er das Template kennen muss, um Typen oder Konstanten einzusetzen.

Es gäbe eigentlich ein Schlüsselwort, export, aber da das von kaum einem Compiler unterstützt wird und selbst bei den anderen nicht wirklich Probleme löst, ist das keine Alternative. Ich wollte es trotzdem am Rande erwähnen.

Edit:

Zitat von »"dot"«

Du kannst die Implementierung eines template nicht in ein separates .cpp file packen
Doch, kann man schon, aber in Übersetzungseinheiten, in denen das Template benutzt wird, darf nicht nur eine Deklaration vorhanden sein.

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

4

24.11.2009, 22:47

okee ... man lernt und vergisst jeden tag aufs neue ... :D ... das is mir absolut entfallen / nicht präsent gewesen ... ...

danke jetzt gehts :)

gruß Zeus

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

24.11.2009, 22:51

Zitat von »"Nexus"«

Zitat von »"dot"«

Du kannst die Implementierung eines template nicht in ein separates .cpp file packen
Doch, kann man schon, aber in Übersetzungseinheiten, in denen das Template benutzt wird, darf nicht nur eine Deklaration vorhanden sein.


Das ist mir klar, deswegen steht dort ja auch "separat" ;)

Werbeanzeige