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 :

Structure des fichiers avec des templates


Sujet :

C++

  1. #1
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut Structure des fichiers avec des templates
    Bonjour,

    J'essaie de structurer un maximum un programme et je me retrouve avec un problème lorsque j'utilise les templates:

    Fichier A.h:
    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
    #ifndef A_H
    # define A_H
     
    template <class T>
    class A
    {
    public:
      A();
      virtual ~A();
     
    private:
      T value;
    };
     
    #endif /* A_H */
    Fichier A.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
    #include <iostream>
    #include "A.h"
     
    template <class T>
    A<T>::A() : value(0)
    {
      std::cout << "Constructeur de A" << std::endl;
    }
     
    template <class T>
    A<T>::~A()
    {
      std::cout << "Destructeur de A" << std::endl;
    }
    Fichier B.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef B_H
    # define B_H
     
    # include "A.h"
     
    class B : public A<int>
    {
    public:
      B();
      ~B();
    };
     
    #endif /* B_H */
    Fichier B.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    #include "B.h"
     
    B::B()
    {
      std::cout << "Constructeur de B" << std::endl;
    }
     
    B::~B()
    {
      std::cout << "Destructeur de B" << std::endl;
    }
    Fichier main.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "A.h"
    #include "B.h"
     
    int main()
    {
      A<int> *a = new B;
      delete a;
      return 0;
    }
    Lorsque je compile, j'ai l'erreur suivante :

    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
    /tmp/ccM9wBFi.o: In function `B::~B()':
    B.cpp:(.text+0x1be): undefined reference to `A<int>::~A()'
    B.cpp:(.text+0x1d7): undefined reference to `A<int>::~A()'
    /tmp/ccM9wBFi.o: In function `B::~B()':
    B.cpp:(.text+0x246): undefined reference to `A<int>::~A()'
    B.cpp:(.text+0x25f): undefined reference to `A<int>::~A()'
    /tmp/ccM9wBFi.o: In function `B::~B()':
    B.cpp:(.text+0x2ce): undefined reference to `A<int>::~A()'
    /tmp/ccM9wBFi.o:B.cpp:(.text+0x2e7): more undefined references to `A<int>::~A()' follow
    /tmp/ccM9wBFi.o: In function `B::B()':
    B.cpp:(.text+0x322): undefined reference to `A<int>::A()'
    B.cpp:(.text+0x363): undefined reference to `A<int>::~A()'
    /tmp/ccM9wBFi.o: In function `B::B()':
    B.cpp:(.text+0x38a): undefined reference to `A<int>::A()'
    B.cpp:(.text+0x3cb): undefined reference to `A<int>::~A()'
    collect2: ld a retourné 1 code d'état d'exécution
    Le compilateur ne trouve pas la définition du destructeur de A. Par contre, lorsque je fais la même chose pour une version non templètisée, alors je n'ai aucun soucis.
    Quelqu'un pourrait m'expliquer d'où provient le problème?

    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Merci beaucoup,

    Je l'avais aperçu il y a un mois environ quand je maîtrisais pas autant le langage C++. Puis j'ai fini par oublier l'astuce.

    Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ouvrir des fichiers avec des programmes externes
    Par julie_lab dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 25/10/2010, 06h05
  2. ouvrir des fichiers avec des noms incomplets
    Par Merel dans le forum MATLAB
    Réponses: 2
    Dernier message: 14/09/2010, 16h01
  3. Réponses: 9
    Dernier message: 04/02/2010, 16h36
  4. Réponses: 3
    Dernier message: 24/03/2009, 14h08
  5. Réponses: 9
    Dernier message: 25/09/2005, 16h33

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