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 :

[template et linker]problème dans le main


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut [template et linker]problème dans le main
    Bonjour,

    Quand je compile, j'ai une erreur de linker :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [Linker error] undefined reference to 'test<int>::test()
    [Linker error] undefined reference to 'test<int>::affich()
    ces deux fonctions sont définis dans le fichier test.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template<class tpe>
    class test{
    private :
     
            Attributs<tpe> **t;/*attribut est une classe utilisant un template car je ne connais pas d'avance le type d'une variable.*/
    public  :
            test();
            void affich();
    };
    Jusque là, il n'y a pas de problème.
    C'est quand dans le main, j'essaye de construire un objet sur la classe test, qu'il me met les erreur de linker :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test<int> obj;
      obj.affich();
    Si vous voulez l'ensemble du code, demandez moi par MP.

    Je précise que je code sous devc++ v4.9.9.2
    et que mon OS est windows 2000.

    Je ne parviens pas à trouver d'ou vien l'erreur.

    P.S: petite précision, si j'enlève "test<int> obj;" dans le main, je n'ai plus d'erreur

    D'avance merci

  2. #2
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Tu as pensé à inclure l'entête de ta classe?

    Donnes nous plus de code, ça aidera.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    l'entête de la classe est bien entendu inclus.

    plus de code, ok
    voila le code de test.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
    #ifndef _TEST_H
    #define _TEST_H
    //LISTE DES INCLUDES
    #include <string>
    #include <stdlib.h>
    #include <iostream>
    #include "Attributs.h"
     
    using namespace std;
     
    template<class tpe>
    class test{
    private :
     
            Attributs<tpe> **t;
    public  :
            test();
            void affich();
    };
     
    #endif
    Celui de 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
    #include <string>
    #include <stdlib.h>
    #include <iostream>
    #include "test.h"
     
    using namespace std;
     
    template <class tpe>
    test<tpe>::test()
    {t=new Attributs<tpe>* (sizeof (Attributs<tpe> )); 
     t[0]=new Attributs<tpe>;   
    }
     
    template <class tpe>
    void test<tpe>::affich()
    {
     cout<<"1:"<<t->type_attribut<<" : "<<t->valeur_attribut<<endl;
    }
    Pour le main, il n'y a que les includes et le code dans le premier message.

  4. #4
    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.

  5. #5
    Membre habitué Avatar de Kurdran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 122
    Points : 140
    Points
    140
    Par défaut
    Je crois que ta syntaxe est juste mais que aucun compilateur ne peux faire ca.

    Je m'explique :
    Aucun compilateur ne peux faire de template précompilé en obj. Le seul moyen c'est de tous mettre dans le h.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Jolyloic, si je comprend bien il faud qu'au lieu d'inclure test.h dans test.cpp, je fasse l'inverse c'est ca?

  7. #7
    Membre habitué Avatar de Kurdran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 122
    Points : 140
    Points
    140
    Par défaut
    Pas tout à fait tu ajoutes le corps des fonctions dans le h et tu supprimes le cpp.

  8. #8
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Pas tout à fait tu ajoutes le corps des fonctions dans le h et tu supprimes le cpp.
    Ou, comme tu le suggérais, et comme c'est dit dans la FAQ, tu ajoutes à la fin de test.h, afin de quand même séparer spécification et implémentation... je trouve que c'est plus "agréable" de lire un fichier .h qui contient juste des spécifs
    (le .cxx sert à indiquer aux autres développeurs que ce fichier n'est pas à compiler , à l'inverse d'un .cpp)

    Enfin si tu as Visual C++ 6, il me semble qu'il a un peu de mal avec cette séparation en 2 fichiers pour les templates, donc tu pourras tout mettre dans ton .h
    And still we will be here, standing like statues ...

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    J'ai fait ce que vous m'avez indiqué, mais j'ai toujours les mêmes erreurs.
    Je vous poste le code de Attributs.h et Attributs.cpp qui est concerné :

    Attributs.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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #ifndef _ATTRIBUTS_H
    #define _ATTRIBUTS_H
    //LISTE DES INCLUDES
    #include <string>
    #include <stdlib.h>
     
    using namespace std;
    //TEMPLATE 
    template <class tpe=int>
    //CLASSE ATTRIBUTS
    class Attributs
    {private:
             string nom_attribut, type_attribut;
             tpe valeur_attribut;
             bool cle;
             int longueur_attribut;
     public: 
             Attributs();
             Attributs(string, string, tpe, bool, int);
             Attributs(Attributs <tpe> &);
             Attributs & operator=(Attributs <tpe> const &);
             void set_nomattribut(string);
             string get_nomattribut();
             void set_valattribut(tpe);
             tpe get_valattribut();
             bool set_tpeattribut(string);
    		 string get_tpeattribut();
             bool get_cleattribut();
             int get_lgrattribut();
             void set_lgrattribut(int);
     
    };
     
    #include Attributs.cpp
     
    #endif
    Et Attributs.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
    #ifdef ATTRIBUTS_H
     
    //LISTE DES INCLUDES
    #include <stdlib.h>
    #include <string>
    #include "Attributs.h"
    using namespace std;
    //------------------------------------------------------------------------------
    //CONSTRUCTEUR PAR DEFAUT
     
    template <class tpe>
    Attributs <tpe>::Attributs()
    {type_attribut="nule";
     valeur_attribut=-1;
    }
    ...
     
    #endif

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Change l'extension.
    .cpp pour un fichier à NE PAS COMPILER n'est pas une bonne idée avec VC++ 6.
    Et pas oublier de blinder le fichier des définitions des fonctions de "inline", avec VC toujours.

    PS: il manque plein de const et autres références constantes dans ce bout de code.
    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...

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    je ne suis pas sous VC mais sous Devc++ 4.9.9.2 comme dit dans le message initiale

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Ah oui. Au temps pour moi.
    (Ceci dit, la remarque pas de .cpp pour définir des choses templates est une mauvaise idée.)
    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...

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Je ne sais pas si ca peut vous aider, mais voila ce que je veux faire :

    J'ai pris comme projet de fin d'année, la création d'un moteur de base de données "light" :
    _Création de tables
    _Création de requettes
    _Création d'états
    _gestion des enregistrements

    donc la classe Attributs sert à définir la structure de la table, plus précisement les champs, c'est pourquoi j'ai voulu utiliser les templates, car je ne sais pas à l'avance de quel type seront les champs. (J'ai determiner 3 types de base : STRING, BOOL, NUMBER).
    Jusque là pas de réel problème.

    Ensuite pour completer cette definition de structure de table, je créé un tableau dynamique d'Attributs, servant à recevoir les différents Attributs.
    C'est ce que j'essaye de faire dans test.
    Et c'est la que ça coince.

    Voila, en ésperant que ca pourra vous aider à résoudre mon problème.

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    ca fait deux jours que je cherche, et que je teste tout et n'importe quoi, mais ya rien a faire.

    Vous voyez pas ce que je peu faire??

  15. #15
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Bonjour,
    A mon avis c'est là que ça peut pécher:
    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
     
    Et Attributs.cpp : 
     
    Code: 
    #ifdef ATTRIBUTS_H  <-------- inutile.
     
    //LISTE DES INCLUDES 
    #include <stdlib.h> 
    #include <string> 
    #include "Attributs.h" 
    using namespace std; 
    //------------------------------------------------------------------------------ 
    //CONSTRUCTEUR PAR DEFAUT 
     
    template <class tpe> 
    Attributs <tpe>::Attributs() 
    {type_attribut="nule"; 
     valeur_attribut=-1; 
    } 
    ... 
     
    #endif
    Si le fichier c est compilé avant l'entête, alors ATTRIBUT_H n'est pas défini.

    C'est les entêtes de fichier qu'il faut protéger contre la double inclusion, pas les fichers C, car il ne faut jamais inclure de fichier *c.

  16. #16
    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
    Par défaut
    Effectivement, je conseille de mettre le code correspondant à l'implémentation d'un template dans un fichier avec iune extention explicite (par exemple, j'ai vu .tpp, .inl, .t++, ...) puis d'inclure ce fichier dans le .h

    Par contre, et c'est bien là ton erreur, si tu l'inclus entre les includes guards de ton fichier d'en-tête, il sera protégé par ceux-ci, et il n'est pas utile et même néfaste de mettre des include guards dans ton .tpp.

    De même, comme ce .tpp est fait pour être inclus dans le .h correspondant, il n'est pas nécessaire d'include ce .h dans le .tpp.
    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.

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    J'ai comme vous me l'avez dit, changer les extensions (de .cpp en .tpp), puis j'ai inclu ces fichiers dans les . h, apres la définition des classes.

    Maintenant j'ai d'autres erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    invalid conversion from 'unsigned int' to 'Attributs<int> *'
    no matching function for call 'Attributs<int>::Attributs();
    //et il me balance l'entête du constructeur par copie et celui par initialisation
    voila, si quelqun avait une idée

  18. #18
    Membre habitué Avatar de Kurdran
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 122
    Points : 140
    Points
    140
    Par défaut
    Ben maintenant tes templates marchent.

    Mais il faut savoir que quand tu crés un objet du type ma_template<int> ce n'est pas le même type que ma_template<unsigned int>. C'est la même différence qu'entre Ma_classe1 et Ma_classe2.

    D'ou ton nouveau problème.

  19. #19
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class tpe> 
    test<tpe>::test() 
    {t=new Attributs<tpe>* (sizeof (Attributs<tpe> )); 
     t[0]=new Attributs<tpe>;    
    }
    L'expression t = new .... est très bizarre: sizeof() renvoie un unsigned int. Attributs<tpe>* (sizeof...) est interprété comme (Attributs<tpe>*) (sizeof...) soit une demande de transtypage (?!) d'où le message refusant d'effectuer le changement de type.
    De toute façon, ne devrait-on pas avoir plutôt qq chose comme
    t=new Attributs<tpe>* [nombre d'éléments désirés]
    Je ne voie pas du tout ce que sizeof (Attributs<tpe> ) a à faire ici.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  20. #20
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    arf comment j'ai fait pour pas le voir!!!!!

    Bon bah voila c'est resolu
    Merci diogène, en plus je me suis apercu que j'ai fait une grosse erreur d'analyse sur mon projet, de ce fait je ne vais pas avoir besoin d'utiliser les template a cet endroit la, cela dit, je comprend mieux le fonctionnement des template maintenant.

    Encor merci a ceux qui m'ont aidé.

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

Discussions similaires

  1. [11g] Problème dans la procédure MAIN
    Par ines_eleuch dans le forum Débuter
    Réponses: 2
    Dernier message: 07/01/2014, 16h40
  2. smartform : problème footer dans le main
    Par Valreg dans le forum SAP
    Réponses: 3
    Dernier message: 26/07/2012, 14h09
  3. [Débutant]Problème dans main.xml
    Par Faf95c dans le forum Android
    Réponses: 3
    Dernier message: 10/10/2011, 14h37
  4. [Joomla!] Problème dans l'installation du template Ja Purity II et d'autres extensions
    Par youza dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 26/04/2010, 10h59
  5. Problème dans mon main
    Par pikaTuX dans le forum C
    Réponses: 10
    Dernier message: 10/12/2007, 14h21

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