Erreur de link en utilisant les templates

Signaler
Messages postés
104
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
12 juin 2005
-
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
-
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

Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

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)
Messages postés
104
Date d'inscription
dimanche 2 mars 2003
Statut
Membre
Dernière intervention
12 juin 2005

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?
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

-------------------------------
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 :)
> >
>
Messages postés
61
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
3 août 2005

Non g aucune idee ! mais bon le principal c que ca marche ! 8-)
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
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