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

Langage C++ Discussion :

initialisation d'un paramètre template statique


Sujet :

Langage C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 28
    Par défaut initialisation d'un paramètre template statique
    Bonsoir,

    En résumé, j'ai une classe dans un .hpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template <class T>
    class A {
        static T t;
        static void initialise(T& the_T);
    [...etc]
    };
    et dans le .cpp correspondant, j'essaye d'écrire le code suivant (c'est comme ça que je faisais d'habitude pour les paramètres statiques non template) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template<class T>
    T A<T>::t ; // là, ça compile
     
    // ..avec :
    template <class T>
    void A<T>::initialise(T& the_T) { // ça compile aussi
        A<T>::t = the_T;
    }
    Dans un 2eme fichier source je tente d'appeler cette fameuse fonction d'initialisation, mais j'obtiens alors une erreur lors de l'édition de liens (T == Fonctions ici) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    undefined reference to `A<Fonctions>::initialise(Fonctions&)'
    Qu'ai-je oublié ?

    Merci d'avance !

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Ce que tu as oublié est un oubli malheureusement classique lorsque l'on commence la "meta programmation"

    Il faut en effet retenir que le compilateur a besoin de pouvoir accéder à l'implémentation des différentes fonctions template (ou méthodes de classes template) et à la définition des variables statiques des classes template

    Et c'est, quelque part logique, si on réfléchit correctement au fonctionnement des fonctions et classes template

    En effet, cela revient à dire au compilateur "je ne sais pas encore quelle donnée tu va manipuler, mais je sais déjà très bien comment tu devra le faire"...

    Dés lors, pour que le compilateur puisse créer le code qui correspond (en espace mémoire nécessaire pour la donnée manipulée) à un type particulier, il faut qu'il puisse remplacer le type "générique" par le type réel dans le code source... et, pour cela, il doit en disposer

    Au final, deux solutions s'offrent à toi:

    • Soit, tu définis tes variables et fonctions statiques (ainsi que toutes les autres, d'ailleurs) directement dans le fichier d'en-tête,
    • Soit tu les définis dans un fichier séparé, dont l'extension est libre pour autant d'éviter l'extension *.cpp et les extensions "connues"(xml, gif, jpg et autres qui ont une signification particulière) comme par exemple *.ipp, *.tpp, *.impl ou ... et tu inclus dans le fichier d'en-tête, après la définition de la classe, ce fichier à l'aide de la traditionnelle directive #include
    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

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 28
    Par défaut
    merci pour ton explication ^^

    Il doit y avoir encore des subtilités qui m'échappent quand même, car en déplaçant l'implémentation de la fonction statique dans la classe A, j'ai exactement la même erreur. Pourtant j'ai ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A truc<Fonctions>;
    truc.initialise(...)
    dans le main. Donc en principe le compilateur devrait savoir qu'il faut une instance de A<Fonctions>, et générer le code correspondant. Enfin, c'est mon interprétation actuelle ..qui doit encore être imprécise.

    [EDIT :]
    J'avais oublié de déclarer la variable t après la classe dans le même fichier .hpp. ça a l'air de fonctionner, merci !

    [petite réflexion :]
    C'est quand même étrange que la compilation se passe mal sans cette ligne, car au final elle ne fait que dire "je te rappelle que cette variable statique existe". La vraie initialisation se fait dans la méthode statique de la classe. Enfin, c'est mon impression ^^

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par Ulath0 Voir le message
    [petite réflexion :]
    C'est quand même étrange que la compilation se passe mal sans cette ligne, car au final elle ne fait que dire "je te rappelle que cette variable statique existe". La vraie initialisation se fait dans la méthode statique de la classe. Enfin, c'est mon impression ^^
    Hé non...

    une variable statique est indépendante de toute instance de la classe dans laquelle elle et déclarée...

    Elle doit donc être initialisée de manière strictement indépendante de toute fonction se rapportant à cette classe

    Il se fait que tu appelle ta fonction statique init, mais, à vrai dire, ce n'est pas ce qu'elle fait: elle modifie la variable statique, elle ne l'initialise pas
    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

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

Discussions similaires

  1. Limiter les types des paramètres templates?
    Par Pragmateek dans le forum C++
    Réponses: 9
    Dernier message: 29/08/2006, 13h14
  2. Appeler une méthode template d'un paramètre template
    Par YéTeeh dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2006, 12h50
  3. Réponses: 15
    Dernier message: 21/08/2006, 01h41
  4. Déclarer un paramètre template comme friend
    Par YéTeeh dans le forum Langage
    Réponses: 4
    Dernier message: 11/04/2006, 14h00
  5. X paramètres templates
    Par Alp dans le forum C++
    Réponses: 8
    Dernier message: 04/04/2006, 22h10

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