Erreur de link en utilisant les templates

cs_Wett Messages postés 104 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 12 juin 2005 - 21 juil. 2003 à 12:29
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 - 28 juil. 2004 à 19:56
Voila j'utilise VC++ 6 et j'ai créé une classe templates toute simple (en fait c une liste chainée :p), de la forme

dans le .h:

template <class T>
class ChainList
{
public:
ChainList();
virtual ~ChainList();
};

et apres dans le fichier .cpp:

template <class T>
ChainList<T>::ChainList()
{
}

template <class T>
ChainList<T>::~ChainList()
{
}

Bon evidemment y'a plus de fonctions mais ca servirai à rien de les mettre ici.
Compilation nickel mais au link j'ai des erreurs du genre :

error LNK2001: unresolved external symbol "public: __thiscall ChainList<class CImage>::ChainList<class CImage>(void)" (??0?$ChainList@VCImage@@@@QAE@XZ)

et ce pour chaque fonction membre de ma classe. :sad)
J'ai lu que le compilateur devait créer une instance de la classe template pour chaque type de données utilisé, p-t qu'il faut le specififer qlq part? ici apparemment il ne trouve pas ces "instances"... Je comprends plus j'y ai passé un moment je sens que c'est un truc tout bete mais comme c'est la 1ere fois que j'utilise les templates ^^

Voila en esperant que qlqun pourra m'aider :)

5 réponses

tcok Messages postés 61 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 3 août 2005
21 juil. 2003 à 12:45
je crois que pour les templates , il ne faut pas separer les declarations et l'implementation...
essaye de mettre le contenu de ton .cpp a la fin du .h, a mon avis ca marcheras ! :big)
0
cs_Wett Messages postés 104 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 12 juin 2005
21 juil. 2003 à 13:09
Ah bahhhhhh oui en effet ca marche du coup.... :shy)
C'est bizarre ce truc qd meme... Tu sais pourquoi il faut à tout prix ne pas separer declaration et definition?
0
tcok Messages postés 61 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 3 août 2005
21 juil. 2003 à 13:10
-------------------------------
Réponse au message :
-------------------------------

>
> Ah bahhhhhh oui en effet ca marche du coup.... :shy)
> C'est bizarre ce truc qd meme... Tu sais pourquoi il faut à tout prix ne pas separer declaration et definition?
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > je crois que pour les templates , il ne faut pas separer les declarations et l'implementation...
> > essaye de mettre le contenu de ton .cpp a la fin du .h, a mon avis ca marcheras ! :big)
> >
> >
> >
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
> > > Voila j'utilise VC++ 6 et j'ai créé une classe templates toute simple (en fait c une liste chainée :p), de la forme
> > >
> > > dans le .h:
> > >
> > > template <class T>
> > > class ChainList
> > > {
> > > public:
> > > ChainList();
> > > virtual ~ChainList();
> > > };
> > >
> > > et apres dans le fichier .cpp:
> > >
> > > template <class T>
> > > ChainList<T>::ChainList()
> > > {
> > > }
> > >
> > > template <class T>
> > > ChainList<T>::~ChainList()
> > > {
> > > }
> > >
> > > Bon evidemment y'a plus de fonctions mais ca servirai à rien de les mettre ici.
> > > Compilation nickel mais au link j'ai des erreurs du genre :
> > >
> > > error LNK2001: unresolved external symbol "public: __thiscall ChainList<class CImage>::ChainList<class CImage>(void)" (??0?$ChainList@VCImage@@@@QAE@XZ)
> > >
> > > et ce pour chaque fonction membre de ma classe. :sad)
> > > J'ai lu que le compilateur devait créer une instance de la classe template pour chaque type de données utilisé, p-t qu'il faut le specififer qlq part? ici apparemment il ne trouve pas ces "instances"... Je comprends plus j'y ai passé un moment je sens que c'est un truc tout bete mais comme c'est la 1ere fois que j'utilise les templates ^^
> > >
> > > Voila en esperant que qlqun pourra m'aider :)
> >
>
0
tcok Messages postés 61 Date d'inscription samedi 7 juin 2003 Statut Membre Dernière intervention 3 août 2005
21 juil. 2003 à 13:12
Non g aucune idee ! mais bon le principal c que ca marche ! 8-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
28 juil. 2004 à 19:56
faut pas les séparer pour une raison tres simple: les fonctions sont instanciées a l'execution, donc sur du code compilé il aura du mal. c'est pareil pour une classe générique ou une fonction inline
0
Rejoignez-nous