Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Funktiontemplates

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
06.07.2006, 17:23 Uhr
TypusM



Hallo,

Folgendes Problem.. ich möchte Funktiontemplates anwenden. Einmal ein "Standard-Template" für alle Zahlen und einmal ein spezifisches für char. Leider kann ich es nur ausführen, wenn ich die Implementation der Funktionen in meiner sagen wir mal main.cpp habe. Sobald ich diese nach außen auf eine andere .cpp haue, mit einer Header verlinke und in der Header die Deklaration der Funktionen angebe, sagt er "unresolved external .....

Code lautet:

C++:
Edit: siehe unten



Zumal bekomme ich einen Fehler wenn ich folgendes verwenden möchte:
template<>
void tfind<char>(char** feld, char wert, int &ind)

Kann sein, dass ich irgendwo hänge ... .. Danke im vorraus.

MfG

Dieser Post wurde am 06.07.2006 um 17:58 Uhr von TypusM editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.07.2006, 17:33 Uhr
TypusM



Ja, neee.. 2. Fehler selbst behoben:
template<>
void tfind<char>(char** feld, char* wert, int &ind)

--> Dereferenzop * gefehlt... Ach.. immer diese Zeiger.. die machen mich noch verrückt.. aber für Problem 1 hab i an un für sich immernoch keine Erklärung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.07.2006, 17:37 Uhr
TypusM



Die direkte Fehlermeldung lautet:

"[Linker Fehler] Unresolved external 'void tfind<int>(int *, int, int& )' referenced from C: \......................."

Dieser Post wurde am 06.07.2006 um 17:37 Uhr von TypusM editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.07.2006, 17:54 Uhr
TypusM



Es erscheibt mir alles immer merkwürdiger. Eine Funktion kann in der impl.cpp stehen, ohne dass der einen Fehler ausgibt, bei der anderen macht er den Fehler.

main.cpp:

C++:
#include <iostream.h>
#include <conio.h>

#include "dekl.h"

template<class T>
void tfind(T* feld, T wert, int &ind)
{
ind = -1;
for (int i=0;i<MAX;i++)
  {
  if (feld[i]==wert)
    {
    ind = i;
    return;
    }
  }
}

void main()
{
int v1[MAX]={3,2,0,2,-10};
char* v2[MAX]={"abc1","ab2","abcd3","abx4","yxc5"};
int ind;

//Ausgabe
cout << "Ausgabe alles:" << endl << endl;

for (int y=0;y<MAX;y++)
  {
  cout << v1[y] << endl;
  }
cout << endl;
for (int y=0;y<MAX;y++)
  {
  cout << v2[y] << endl;
  }

cout << endl;

//SUCHE IN INT-FELD
tfind(v1,2,ind);
cout << "2 gefunden bei Index: " << ind << endl;

//SUCHE IN STRING-FELD
tfind<char>(v2,"abx4",ind);
cout << "'abc4' gefunden bei Index: " << ind << endl;

getch();
}



impl.cpp

C++:
#include <iostream.h>
#include <conio.h>

#include "dekl.h"



template<>
void tfind<char>(char** feld, char* wert, int &ind)
{
ind = -1;
for (int i=0;i<MAX;i++)
  {
  if (strcmp(feld[i],wert)==0)
    {
    ind = i;
    return;
    }
  }
getch();
}



dekl.h

C++:
const int MAX=5;

template<class T>
void tfind(T* feld, T wert, int &ind);

template<>
void tfind<char>(char** feld, char* wert, int &ind)



Schiebe ich jetzt die Funktion "template<class T>void tfind(T* feld, T wert, int &ind)" in die impl.cpp spuckt er den Fehler. Ich habe keinerlei Erklärung dafür. Jetzt seid ihr dran

MfG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.07.2006, 18:29 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi,
templates gehören in den header. d.h:

dekl.h

C++:

template<class T>
void tfind(T* feld, T wert, int &ind)
{
ind = -1;
for (int i=0;i<MAX;i++)
  {
  if (feld[i]==wert)
    {
    ind = i;
    return;
    }
  }
}

template<>
void tfind<char>(char** feld, char* wert, int &ind)
{
ind = -1;
for (int i=0;i<MAX;i++)
  {
  if (strcmp(feld[i],wert)==0)
    {
    ind = i;
    return;
    }
  }
getch();
}



--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.07.2006, 18:49 Uhr
TypusM



Okay. Wer lesen kann ist klar im Vortteil. Ich habe überlesen, dass die Implementationen in eine sogenannte impl.tpp müssen. Aber sie sollen NICHT in den Header. So will es der Prof. Was nun?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.07.2006, 22:12 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja dann halt die impl.tpp inkludieren. templates müssen inkludiert werden, normale cpp-dateien nicht, darum die trennung zu .tpp
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.07.2006, 22:46 Uhr
~MartinF
Gast


Templates müssen immer in Headerdateien. Manchmal bekommen die Headerdateien die spezielle Extension *.tpp oder ähnliche, um sie von den normalen Headern unterscheiden zu können.

Fakt ist auf jedem Fall, dass man Templatedefinitionen nicht kompilieren kann... warum das so ist denke ich mal ist jedem klar. Und aus diesem Grund landen die Implementationen von Templates auch nicht in Quelltextdateien (*.cpp).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.07.2006, 08:09 Uhr
(un)wissender
Niveauwart



Zitat von MartinF:

[...]Templatedefinitionen nicht kompilieren kann...



Klar kann man die kompilieren, und zwar genau dann, wenn alle Typen der Vorlage bekannt sind. Darum kann auch


C++:
template<>
void tfind<char>(char** feld, char* wert, int &ind)
{
ind = -1;
for (int i=0;i<MAX;i++)
  {
  if (strcmp(feld[i],wert)==0)
    {
    ind = i;
    return;
    }
  }
getch();
}



ganz normal in einer *.cpp Datei stehen, ohne im Header includiert (tolles Wort) zu sein.

Übrigens erschient mir diese Spezialisierung nicht sauber. Es sollte void tfind<char *> heißen und nicht void tfind<char *>.


Bearbeitung:

Es gibt auch noch das Schlüsselwort export, mit diessen Hilfe templates auch ohne konkrete Vorlangen kompiliert werden können. also in der cpp stehen können. Nachteil ist hier nur, das nur 1 bis 2 Kompiler das unterstützen und auch dann der Code des Templates in irgendeiner Form mitgeliefert werden muss, meistens als Zwischendatei.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 07.07.2006 um 08:13 Uhr von (un)wissender editiert.
 
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: