Aller au contenu
Zebulon
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[Résolu] Problème de templates en C++


PaTaToR

Messages recommandés

Bonjour à tous !

 

Alors voila le problème. J'ai créé une classe maillon avec des templates.

Quand je veux déclarer un objet de la classe maillon dans mon main, j'ai un message d'erreur à la compilation :

g++ -I/usr/openwin/include -c -Wno-deprecated Client.cc

g++ -I/usr/openwin/include -c -Wno-deprecated Liste.cc

g++ -o tp Client.o maillon.o

Client.o(.text+0x17): In function `main':

: undefined reference to `maillon<int>::maillon[in-charge]()'

Client.o(.text+0x22): In function `main':

: undefined reference to `maillon<int>::~maillon [in-charge]()'

collect2: ld a retourné 1 code d'état d'exécution

make: *** [tp] Erreur 1

zsh: exit 2 make

 

Je ne comprend pas d'où vienne ces messages d'erreur ni ce qu'ils signifient.

Je dois surement mal m'y prendre avec mes templates... A vrai dire, j'ai jamais vraiment eu de cours la dessus, et j'ai fait ça en m'inspirant d'un code que j'avais trouvé sur le net.

 

 

J'ai 3 fichiers :

 

maillon.h

#include <stdio.h>

template <class T> class maillon {
  private:
	T data;
	maillon *suivant;

  public:
	maillon(void);
	~maillon(void);
};

 

 

maillon.cc

#include <stdio.h>
#include <iostream.h>
#include "maillon.h"

template <class T> maillon<T>::maillon(void):suivant(NULL){}
template <class T> maillon<T>::~maillon(void){}

 

 

et client.cc

#include <stdlib.h>
#include <iostream.h>
#include "maillon.h"

int main()
{
maillon<int> lalalala;
}

 

 

A noter que si je rajoute des parenthèses aprés "lalala", le programme se compile bien.

Que faire?

Modifié par PaTaToR
Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Ce n'est pas la faute des templates... C'est plutôt un problème de base.

 

Tu inclues un fichier entête maillon.h dans client.cc or rien ne relie maillon.h à maillon.cc. C'est maillon.cc qu'il faut inclure. Il inclura lui-même son entête. C'est ainsi que les choses se passent normalement.

 

 

Merci c'était exactement ça. J'avais pas pensé à le signaler, mais en fait, j'avais réussi à trouver la solution (par hasard). Je m'en vais mettre un petit [Résolu].

 

Merci encore :P

Lien vers le commentaire
Partager sur d’autres sites

Vous incluez les .cc dans les fichiers de code, vous ?!?

Alors ça sert à quoi de compiler maillon.cc si tout le code qui y est sera de toute façon recompilé dans Client.cc ?

Ca sert à quoi d'avoir plusieurs .o ?

 

Y'aurait pas plutôt un souci au niveau des constructeurs et destructeurs parce qu'ils ne sont pas déclarés en maillon<T>() et ~maillon<T>() ?

Lien vers le commentaire
Partager sur d’autres sites

Y'aurait pas plutôt un souci au niveau des constructeurs et destructeurs parce qu'ils ne sont pas déclarés en maillon<T>() et ~maillon<T>() ?

 

 

A vrai dire, j'avais essayé, mais ça ne changeait rien.

En fait, je me suis laissé dire que qunad on utilisait des templates, il fallait mettre tout son code dans le .h (pas de .cc) ou quil fallait inclure les .cc dans le .h et dans le client.cc

Lien vers le commentaire
Partager sur d’autres sites

Non, sans déconner... Y'a des gens qui enseignent ça ?

 

Non non pas du tout !!

Personne ne me l'a enseigné justement ! En fait, j'ai constaté tout seul que en deplaçant mon code de mon .cc vers mon .h, ça fonctionnait (si je ne le fais pas, impossible de compiler). Aprés, un pote m'a dit d'inclure le .cc de partout pour que ça marche... Et ça marche, ne me demande pas pourquoi.

Enfin bon, au final, inclure les .cc de partout ou mettre tout son code dans le .h, ça revient à peu près au même non ?

 

 

 

En fouillant un peu sur le net, j'ai trouvé ça. Ca colle un peu avec ce que je dis non ? (ou alors j'ai rien compris lol)

 

Les template doivent impérativement être définis lors de leur instanciation, pour que le compilateur puisse générer le code de l'instance. Cela signifie que les fichiers d'en-tête doivent contenir non seulement la déclaration, mais également la définition complète des template.

 

Source : http://www.developpez.com/c/megacours/x4522.html

Paragraphe 12.4.3

Modifié par PaTaToR
Lien vers le commentaire
Partager sur d’autres sites

Oui, désolé. Vous avez raison tous les deux.

 

J'ai dit l'inverse de ce qu'il fallait dire. Ce sont bien les templates qui génèrent ce problème.

En temps normal le lieur retrouve les fonctions et les classes dans le fichier objet grace à leur signatures. Par exemple pour une fonction la signature contient le nom de la fonction ainsi que le type renvoyé et les types des arguments. Or le souci avec les templates c'est que les types utilisés sont variables. Ce n'est qu'une fois la classe instanciée que le compilateur connait les signatures exactes de chaque fonction de la classe. Pour cette raison l'implémentation d'une classe template ne peut pas être compilé séparemment du fichier qui l'instancie.

 

Dès que le compilateur rencontre ceci : maillon<int> lalalala;

Il va pouvoir générer le code de la classe en remplaçant T par int.

Lien vers le commentaire
Partager sur d’autres sites

  • Dylav a modifié le titre en [Résolu] Problème de templates en C++

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...