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 :

Probleme sur les templates (un peu stupide)


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Probleme sur les templates (un peu stupide)
    Salut !
    Bon voila je fais un petit programme simple sur les templates pourtant tout est clair.Mais ca marche pas un code erreur générer : [Linker error] undefined reference to `Paire<int>:aire()'

    bref le code Paire.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
    16
    17
    18
    19
    20
    21
    22
    #include<iostream>
     
     using namespace std;
     
     
     
     template < class T> class Paire 
          { 
              T val; 
     
     
              public: 
     
              Paire();
              Paire(T a);          
     
              T getval();
     
     
     
     
          };
    Paire.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
    #include"Paire.h"
     #include<iostream>
     
     using namespace std;
     
     
     
     
     
     template <class T> Paire<T>::Paire()
     {
       val=0;         
     }
     
     
     template <class T> Paire<T>::Paire(T a)
     {
        val =  a;         
     }
     
     
     
     
     template <class T> T Paire<T>::getval()
     {
       return val;
     }
    le main.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
    #include"Paire.h"
    #include <cstdlib>
    #include <iostream>
     
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
     
     
       Paire<int> a;
     
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }

    Merci.

  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Il faut mettre le code que tu as mis dans paire.cpp, dans paire.h

    Je ne me risquerai pas à expliquer pourquoi, de peur de dire quelque chose d'imprécis. Retiens juste que dans le cas des template, il faut mettre l'implémentation dans le .h

    Il me semble qu'il y a une entrée de la FAQ là-dessus, n'hésite pas à la consulter avant de poster .

  3. #3
    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 white_tentacle Voir le message
    Je ne me risquerai pas à expliquer pourquoi, de peur de dire quelque chose d'imprécis. Retiens juste que dans le cas des template, il faut mettre l'implémentation dans le .h
    Il existe le mot clé export qui permet de séparer la définition d'une déclaration mais il est loin d'être implémenté par tout les compilateurs. En fait c'est même le contraire, un seul compilo l'implémente et les développeurs du compilo conseillent aux autres développeurs de compilo de ne pas développer cette feature. Si j'ai bien compris la problématique est dans le respect du 'one definition rule' : un truc ne doit être définit qu'une fois. Ici la polémique.

    Citation Envoyé par white_tentacle Voir le message
    Il me semble qu'il y a une entrée de la FAQ là-dessus, n'hésite pas à la consulter avant de poster .
    Ici.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    L'explication "simple" tient au fait que, lorsque tu définis une fonction ou une classe template, le compilateur n'a - fatalement - aucune idée du type qui sera utilisé.

    Or, une fois un code compilé, un type est d'abord et avant tout... une quantité donnée de mémoire utilisée pour représenter l' (les différentes) information(s) représentées par ce type.

    Le compilateur n'a donc aucun moyen de déterminer quel espace mémoire laisser pour la représentation du type dans le code binaire tant que l'on n'a pas déterminé un (des) type(s) réel(s) pour remplacer le(s) type(s) générique manipulé(s) par la classe ou la fonction.

    De plus, la compilation s'effectue "unité de compilation par unité de compilation" (1 fichier *.cpp et les en-têtes qu'il utilise à la fois) et le compilateur "oublie" tous les symboles qu'il a pu définir dans une unité de compilation une fois qu'il a fini de travailler dessus...

    Il doit donc être en mesure de disposer du code à convertir en "instructions processeur" chaque fois que nous lui indiquons d'utiliser la classe ou la fonction avec un type particulier

    Et le seul endroit où il sera en mesure de trouver ce code est, de manière directe ou indirecte, dans... le fichier d'en-tête dans lequel la fonction est déclarée ou la classe définie

    Si je précise de manière directe ou indirecte, c'est parce qu'il y a la possibilité de séparer l'implémentation de la déclaration dans un fichier "à part" pour lequel nous utiliserons n'importe quelle extension à part les extensions "connues comme représentant un type de fichier particulier" (par exemple, *.imp, *impl, *.tpp,...) et... d'inclure ce fichier séparé à l'aide de la directive include dans le fichier d'en-tête.

    J'avais précisé que la raison était simple, pas qu'elle serait courte
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. [2.x] Probleme sur les template hérités et les blocks.
    Par jejeman dans le forum Symfony
    Réponses: 3
    Dernier message: 14/05/2014, 10h06
  2. probleme sur les chaines de caractere
    Par foufi5 dans le forum C
    Réponses: 8
    Dernier message: 22/12/2005, 15h30
  3. [C#] Probleme sur les clés primaires composites
    Par stardeus dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/02/2005, 23h28
  4. MS Access et TQuery (probleme sur les dates)
    Par Djob dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/06/2004, 14h57
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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