Newsgroup: it.comp.lang.c++
Titolo: Aiuto sui Template!!!

Ho provato ad implementare una classe generica dichiarandola all'interno di
un file header (supponiamo "RBTrees.h").
Implementando i metodi della classe all'interno del file stesso non ho alcun
problema e tutto funziona.
Provando pero' a spostare l'implementazione dei metodi in un altro file (ad
esempio "RBTrees.cpp"), quando il compilatore
effettua il linking termina con una serie di errori, non riuscendo a trovare
una implementazione corretta per il metodo utilizzato
data la classe...
Cioe':
--------------------Configuration: Prova - Win32 Debug--------------------
Compiling...
main.cpp
RBTrees.cpp
Linking...
main.obj : error LNK2001: unresolved external symbol "public: int *
__thiscall CRBTree<int>::InOrder(int *)" (?InOrder@?$CRBTree@H@@QAEPAHPAH@Z)
main.obj : error LNK2001: unresolved external symbol "public: int *
__thiscall CRBTree<int>::Maximum(void)" (?Maximum@?$CRBTree@H@@QAEPAHXZ)
main.obj : error LNK2001: unresolved external symbol "public: int *
__thiscall CRBTree<int>::Minimum(void)" (?Minimum@?$CRBTree@H@@QAEPAHXZ)
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall
CRBTree<int>::Delete(int)" (?Delete@?$CRBTree@H@@QAEHH@Z)
main.obj : error LNK2001: unresolved external symbol "public: int __thiscall
CRBTree<int>::Insert(int)" (?Insert@?$CRBTree@H@@QAEHH@Z)
main.obj : error LNK2001: unresolved external symbol "public: __thiscall
CRBTree<int>::CRBTree<int>(void)" (??0?$CRBTree@H@@QAE@XZ)
main.obj : error LNK2001: unresolved external symbol "public: __thiscall
CRBTree<int>::~CRBTree<int>(void)" (??1?$CRBTree@H@@QAE@XZ)
Debug/Prova.exe : fatal error LNK1120: 7 unresolved externals
Error executing link.exe.
Prova.exe - 8 error(s), 0 warning(s)
Come posso risolvere l'inghippo? Spero che ci sia qualche metodo perche' i
miei poveri schemi mentali sarebbero
sconvolti da una simile limitazione (ormai programmo cosi' da tempo...).
Vi ringrazio anticipatamente!!!
-
Claudio "Sta'ja Ame" Pozzoli

 sconvolti da una simile limitazione (ormai programmo cosi' da tempo...).
Devi scrivere tutto nel file .h e includere di volta in volta.
Ciao.
-- 
     (ZZZ)       Filippo Salotti, Bagni di Lucca, Lucca, Italy.
    //   \\  _                 E-mail : 
fil...@humnet.unipi.it
   /Y\    ZD<_o===============================================o
 .oZZZZZo.     | Studente Ingegneria Informatica Automatica  |
<OXXXXXXXO>    | Dip. Sistemi Elettrici Universita' di Pisa. |

 wrote in message
375F9F7A...@lunet.forum.lu.it...


Mi sembra però che questo sia un limite di VC++6 e di molti altro
compilatori in giro.
In realtà secondo lo standard (se ben ricordo) esiste la keyword export che
dovrebbe servire proprio a separare implementazione da interfaccia per i
template.
In attesa di un compilatore standard...
Livio Cavallo

 wrote in message
news:7k8bf5$juv$1...@nslave1.tin.it...

In effetti il metodo esiste per "aggirare" questo problema.
In alcuni casi NON e' possibile inserire tutto nel .h.
Se creo delle librerie voglio far vedere al cliente solo il
.h e non il codice.
Giustamente, da parte del compilatore, lui crea il codice solo
per gli oggetti che effettivamente saranno poi istanziati.
Se io racchiudo tutto nel .h, il compilatore genera tutto il codice,
perche' viene considerato come metodi "inline".
Per ovviare a questo basta instanziare delle classi "fittizie" nel .cpp
Esempio:
template class Mia_Classe<int>;
template class Mia_Classe<float>;
......
In questa maniera tutto funziona (naturalmente se come template per
Mia_Classe uso int o float)
Spero di essere stato chiaro e di aver aiutato un po' la comprensione
del problema.
Ciao Fabrizio.

 template.
Non ne ho mai sentito parlare. Sei sicuro che esista?
EMG

 Non ne ho mai sentito parlare. Sei sicuro che esista?
Esiste, ma non la implementa nessuno.
	Mauro