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 de link avec les templates


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Par défaut Erreur de link avec les templates
    Bonjour,
    Tout d'abort, non, ce n'est pas le problême de la séparation de la source et du header ; je suis déja passé par lâ, tout le code est dans un seul fichier.h
    Donc j'ai un code qui ressemble de loin à cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template <typename T> class A {
         public:
              class B { ... } ;
              ...
              static int truc ;
    } ;
    Les methodes de la classe B ont besoin d'acceder à la variable truc, mais le linker me dit des affaires du genre :
    in function A<T>::B::func() : undefined reference to A<T>::truc
    Mais le plus rigolo c'est que il n'affiche des erreures que pour CERTAINES methodes de la classe B accedant à truc. Peut-etre qu'il limite le nombre d'erreur affichées ? Sinon c'est vraiment super-bizarre. Quelqu'un à une idée ? Voici un programme complet qui reproduit l'erreur:

    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
     
    #include <iostream>
     
    template <typename T> class A {
            public:
                    class B {
                            public:
                                    int func() {
                                            truc = 3 ;
                                            return truc ;
                                    }
                    } ;
                    B b ;
                    static int truc ;
    } ;
     
    int main() {
            A<int> a ;
            std::cout << a.b.func() << std::endl ;
            return 0 ;
    }
    Merci

  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 : 50
    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
    Par défaut
    Tu as juste déclaré A::truc, mais tu ne l'as pas défini. Ajouter la ligne suivante à ton programme le fait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template <class T> int A<T>::truc;
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Par défaut
    Ah, super, merci je pense que ca marche. Je pensais que ma ligne dans la classe la définissait: c'est un peu idiot d'ailleurs de devoir faire les deux vu que la definition ne contient pas plus d'info que la déclaration. Mais bon ca à l'air de marcher. Quel affreux langage ;-) Merci en tout cas.

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Tiens. Je n'aurais pas pensé que cela passe et que l'on puisse faire des variables globales paramétrées sans spécifier explicitement toutes les spécialisations qui nous intéresseraient.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    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 : 50
    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
    Par défaut
    Un petit exemple tiré de la norme (14.5.1.3) :
    14.5.1.3 Static data members of class templates
    1 A definition for a static data member may be provided in a namespace scope enclosing the definition of the static member’s class template. [Example:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<class T> class X {
    static T s;
    };
    template<class T> T X<T>::s = 0;
    —end example]
    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.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par suiss007
    Ah, super, merci je pense que ca marche. Je pensais que ma ligne dans la classe la définissait: c'est un peu idiot d'ailleurs de devoir faire les deux vu que la definition ne contient pas plus d'info que la déclaration. Mais bon ca à l'air de marcher. Quel affreux langage ;-) Merci en tout cas.
    Il faut les 2 car lors de la définitiond e la classe, elle n'est pas instanciée, c'est que dans un cpp que c'est fait, et comme il faut le faire dans un seul de ces cpp, il faut le faire à la main.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Miles
    Il faut les 2 car lors de la définitiond e la classe, elle n'est pas instanciée, c'est que dans un cpp que c'est fait, et comme il faut le faire dans un seul de ces cpp, il faut le faire à la main.
    On est dans un template, donc pratiquement la definition doit etre dans un entete.

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

Discussions similaires

  1. Erreur d'exécution avec les Runtime
    Par denils dans le forum Runtime
    Réponses: 30
    Dernier message: 22/01/2015, 15h21
  2. Réponses: 8
    Dernier message: 20/03/2011, 02h21
  3. [Templates] Erreur avec les templates
    Par tmanta7 dans le forum C++
    Réponses: 4
    Dernier message: 07/10/2008, 14h09
  4. Erreurs de link avec fenêtres win32
    Par crossbowman dans le forum Windows
    Réponses: 4
    Dernier message: 21/02/2006, 01h08
  5. Probleme avec les templates
    Par TeC_MaN dans le forum C++
    Réponses: 2
    Dernier message: 08/01/2006, 14h53

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