Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

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

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
24.08.2003, 13:03 Uhr
~Jogi76
Gast


Hallo Leute,

ich bin grade dabei mich in Templates einzuarbeiten. Nur leider komme ich da ja mal garnicht weiter. Bekomme beim linken immer folgende Fehlermeldungen:

Temporäre Dateien und Ausgabedateien für "TStack_01 - Win32 Debug" werden gelöscht.

Code:
--------------------Konfiguration: TStack_01 - Win32 Debug--------------------
Kompilierung läuft...
main.cpp
TStack.cpp
Linker-Vorgang läuft...
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall TStack<char>::~TStack<char>(void)" (??1?$TStack@D@@QAE@XZ)
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: char __thiscall TStack<char>::Pop(void)" (?Pop@?$TStack@D@@QAEDXZ)
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: int __thiscall TStack<char>::Size(void)" (?Size@?$TStack@D@@QAEHXZ)
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: int __thiscall TStack<char>::Push(char)" (?Push@?$TStack@D@@QAEHD@Z)
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall TStack<char>::TStack<char>(int)" (??0?$TStack@D@@QAE@H@Z)
Debug/TStack_01.exe : fatal error LNK1120: 5 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

TStack_01.exe - 6 Fehler, 0 Warnung(en)    :cry:



Muß ich da beim VC++ noch ihrgendetwas einstellen ? Wär echt super wenn mir da einer weiterhelfen kann ! Ich sag schonmal DANKE.

Hier der code:

C++:
// TStack.h

#ifndef STACK_H
#define STACK_H
// Stack als Template !!

#include <iostream.h>
#include <string.h>

template <class TDaten>
class TStack
{
  private:
    TDaten *daten;
    int anz;
    int anzmax;
  public:
     TStack(int);
     ~TStack();

     int Push(TDaten);
     TDaten Pop();
     int Size();
};

#endif

// TStack.cpp

#include "TStack.h"

template <class TDaten>
TStack<TDaten>::TStack(int x)
{
  daten = new(TDaten[x]);

  if(daten)
  {
    anz = 0;
    anzmax = x;
  }
  else
  {
    anz = maxanz = 0;
    cout << "SPEICHERFEHLER !!! " << endl;
  }
}
///////////////////////////////////////////////////////////////////////    
template <class TDaten>
TStack<TDaten>::~TStack()
{
  if (daten) delete []daten;
}
///////////////////////////////////////////////////////////////////////    
template <class TDaten>
int TStack<TDaten>::Push(TDaten x)
{
  if (anz < anzmax)
  {
    daten[anz++] = x;
    return 1;
  }
  else
  {
    return 0;
  }
}
///////////////////////////////////////////////////////////////////////    
template <class TDaten>
TDaten TStack<TDaten>::Pop()
{
  if (anz > 0)
  {
    return (daten[--anz]);
  }
  else
  {
      return 0;
  }
}
///////////////////////////////////////////////////////////////////////    
template <class TDaten>
int TStack<TDaten>::Size()
{
  return (anz);
}
///////////////////////////////////////////////////////////////////////    

// main.cpp

#include "TStack.h"

int main()
{
  const int SIZE = 81;
  unsigned int i;      

  TStack<char> s1(SIZE);   // Stack für char

  char string[SIZE];

  cout << " Bitte String eingeben (max. 81 Zeichen) : ";
  cin.getline(string, SIZE);

  cout << "\n";

  for (i=0; i < strlen(string); i++)
  {
    s1.Push(string[ i ]);
  }
  cout << "\n";

  while(s1.Size())
  {
    cout << s1.Pop();
  }
  cout << "\n";

  return 0;
}


Mfg Jogi

-- edit: Pablo: [ cpp ] Tags eingefügt --

Dieser Post wurde am 24.08.2003 um 13:11 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.08.2003, 13:19 Uhr
virtual
Sexiest Bit alive
(Operator)


Bei Templates darf keine .cpp Datei verwendet werden: alles in den header, auch die Implementierung.
--
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
002
24.08.2003, 13:28 Uhr
~Jogi76
Gast


Besten Danke virtual !

Oh man ! sachen gibts !
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.08.2003, 11:30 Uhr
0xdeadbeef
Gott
(Operator)


Ist denn klar, warum das so sein muss, oder brauchst du ne Erklärung?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.09.2003, 18:18 Uhr
~Jogi76
Gast


Hmm, ja ich denke mal das sich die impl dann mit dem benutzten Datentyp
selbst generiert. Oder so ähnlich...

genau weiß ich es nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.09.2003, 18:53 Uhr
Pablo
Supertux
(Operator)


Aber ich! Ich möchte schon gern wissen, wieso Templates nur in den Header Files geschrieben werden müssen. Schließlich ist für den Compilier egal, weil der #include Preprozessor ist wie ein copy & paste. Wieso lässt sich nicht in den Cpp Dateien schreiben?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.09.2003, 19:07 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ich würde das auch so verstehen wie Jogi 76 es beschrieben hat.

Du machst ja quasi eine Datentypenunabhänigige beschreibung deiner Funktionen und klassen. Erstellt wird die passende Implementierung dazu automatisch vom compiler erst dann, wenn du diese konkret auf einen Typen anwendest
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.09.2003, 08:28 Uhr
0xdeadbeef
Gott
(Operator)


Jogi hat recht. Die eigentlichen Klassen werden zur Compilezeit aus den templates erstellt, und dafür muss auch die Implementierung bekannt sein.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
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: