IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Erreur "undefined reference to" avec les templates


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Erreur "undefined reference to" avec les templates
    Hello tout le monde ^^, je débute en c++ .J ai un problème au niveau des templates.
    J ai tout mis dans un ficher .h, mais j obtiens quand même une erreur à la compilation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /tmp/ccIIxsFq.o: In function `main':
    Test.cpp:(.text+0x19): undefined reference to `ClassiqueRle::ClassiqueRle()'
    Test.cpp:(.text+0x29): undefined reference to `ClassiqueRle::~ClassiqueRle()'
    dans mon fichier Test.cpp

    j ai 2 fichiers : Regle.h et Test.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    //Regle.h
     
    #ifndef REGLE_H_
    #define REGLE_H_
     
    template <class T> struct Regle
    	{
    		public:
     
    		 virtual void setvoisinage(T nb);
    		 virtual T getvoisinage();
     
    		Regle<T>();		
    		virtual ~Regle<T>();		
    	};
     
    struct ClassiqueRle :  public Regle<int> {
     
    private:
    	int nb;
     
    public:
     
    	//Creer la regle
    	void setvoisinage(int nb)
    	{
    		this->nb=nb;
    	}
    	//Accede a la regle
    	int getvoisinage()
    	{	
    		return this->nb;	
    	}
     
    	ClassiqueRle();	
    	~ClassiqueRle();
     
    };
     
    #endif /* REGLE_H_ */
    mon fichier Test.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //Test.cpp
    #include "Regle.h"
     
    int main()
    {
    	using namespace std; 
     
    	ClassiqueRle R;
     
    	return 0;
    };
    Je vois vraiment pas comment résoudre mon problème

  2. #2
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Tu as déclaré le constructeur et le destructeur de ClassiqueRle mais tu ne les a pas définis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ClassiqueRle()
    :
    Regle<int>(),
    nb()
    {
     
    }
     
    ~ClassiqueRle()
    {
     
    }

  3. #3
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Attention aussi : Pour les templates, il faut mettre la définition des fonctions membres dans le même fichier que la déclaration de la class ( ici le *.h ), sinon ça plante à l'édition des liens, c'est lerreur de débutant classique ( voir ici )

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    C'est surprenant de débuter le C++ ... avec des templates et des fonctions virtuelles.

    Ensuite, comme le dit Flo., le constructeur et le destructeur de la classe de base sont de toute façon utilisés. Donc, si tu les déclares alors il faut les définir. si tu les déclares. Dit autrement, si ceux-ci ne font rien de bien spécifique, alors ne les déclare pas, le compilateur saura très bien s'en sortir.

    F.A.Q. : Quand dois-je définir un constructeur par défaut ?
    F.A.Q. : Quand dois-je définir un destructeur ?

    Je ne perçois pas du tout l'intérêt de ton design. J'ai l'impression que tu essais de mettre trop de chose en même temps, chose que tu n'a pas l'air de maîtriser. Je parie à une usine à gaz d'ici quelques temps

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Hello, j ai enlevé la déclaration du constructeur et destructeur mais j ai tjs la meme erreur.

    Oui on pourrait croire que cela va me donner une usine à gaz plus tard >_<.

    En fait dans le cadre d un projet sur le jeu de la vie, je dois faire en sorte que ma règle pour évaluer le voisinage de mes cellules, soit génerique. le professeur qui me suit me demande de respecter le design pattern Strategy pour la règle d évolution d 'où ma structure.

    En tt cas , je vous remercie de votre aide ;-)

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Désolé je me suis trompé , j ai ces erreurs là maintenant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /tmp/ccyzbmN4.o: (.rodata._ZTV5RegleIiE[vtable for Regle<int>]+0x8): undefined reference to `Regle<int>::setvoisinage(int)'
    /tmp/ccyzbmN4.o: (.rodata._ZTV5RegleIiE[vtable for Regle<int>]+0xc): undefined reference to `Regle<int>::getvoisinage()'
    collect2: ld returned 1 exit status

  7. #7
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Effectivement

    Les fonctions suivantes sont là encore déclarées mais pas définies:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void Regle<int>::setvoisinage(int);
    T Regle<int>::getvoisinage();
    Si tu veux les rendre virtuelles pures il faut l'écrire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    virtual void setvoisinage(T nb) = 0;
    virtual T getvoisinage() = 0;
    D'ailleurs là aussi il manque une définition correspondant aux déclarations suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Regle<T>();		
    virtual ~Regle<T>();
    Chaque fois que tu déclares une fonction il faut la définir quelque part ou sinon la déclarer comme virtuelle pure. Virtuelle tout court ne suffit pas pour se passer de sa définition.

    Flo.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Tarek_GE Voir le message
    En fait dans le cadre d un projet sur le jeu de la vie, je dois faire en sorte que ma règle pour évaluer le voisinage de mes cellules, soit génerique. le professeur qui me suit me demande de respecter le design pattern Strategy pour la règle d évolution d 'où ma structure.
    'Générique' cela ne veut rien dire en soi. C'est générique par rapport à quoi ? Ou dit autrement quel est l'axe de variation recherché ?

    Je ne vois pas de pattern stratégie dans ce que tu présentes. Pour un description du pattern stratégie et un exemple de mise en oeuvre, cf cet article sur le DP stratégie.

    L'approche générique et pattern stratégie peuvent aussi vouloir désigner des politiques. A ce moment, cf cet article.

    L'approche générique peut être pertinente dans cet exercice mais il faut d'abord faire un travail de design pour déterminer les différents points d'abstractions/variations et savoir par quels moyens les introduire : héritage, générique, ou les 2. Bref, tu codes trop tôt

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je dois implémenter des règles de différents types.. une règle peut soit représenter le nombre de voisins minimum , soit la densité des cellules voisins, etc..pour que la cellule reste vivante à la prochaine itération.

    Pour moi la classe Règle est une classe abstraite dont le comportement est implementé par d autre classe. RegleDensité, RegleClassique etc.

    Je n avais pas prévu de faire que la règle d évolution soit dynamique à la base.

    Je pense que mes erreurs sont dues au fait que les fonctions doivent être purement virtuelles..

    Je ne pourrai tester çA que lundi malheureusement .

    Bon Dimanche à tous !

Discussions similaires

  1. Erreur compilation : undefine reference to '_
    Par Darksnakes dans le forum Débuter
    Réponses: 9
    Dernier message: 11/03/2009, 11h49
  2. [Templates] Erreur avec les templates
    Par tmanta7 dans le forum C++
    Réponses: 4
    Dernier message: 07/10/2008, 14h09
  3. Réponses: 2
    Dernier message: 27/03/2008, 16h57
  4. Erreur compilation "undefined reference to "
    Par ViRouF dans le forum C++
    Réponses: 5
    Dernier message: 02/03/2007, 14h55
  5. Erreur de link avec les templates
    Par suiss007 dans le forum C++
    Réponses: 6
    Dernier message: 04/01/2007, 11h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo