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 :

Question de liaison avec des template


Sujet :

Langage C++

  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut Question de liaison avec des template
    Salut,

    Je dois compiler un projet avec ces contraintes.

    Le fichier A.h contient des template, donc n'a pas pratiquement aucun développement dans un A.cpp.

    Le fichier BB.cpp avec son BB.h a besoin de A.h
    Le fichier CC.cpp a besoin de A.h

    Le code final a enfin besoin de BB.h et de CC.h. évidement on va avoir des erreurs de liaisons multiples.

    En C la résolution des entêtes avec leurs unités de développement ne pose pas de problème selon des règles de compilations conditionnelles.

    Avec C++ et le mirage des template ces règles ne fonctionnent plus.

    Mais qui sait ? Comment faire ?

    On dirait que les template c'est bien pour qui peut s'en servir le premier.

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Mets tous tes templates dans A.h et tout ira bien.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par dj.motte Voir le message
    Le code final a enfin besoin de BB.h et de CC.h. évidement on va avoir des erreurs de liaisons multiples.
    Normalement ça ne devrait pas poser de problème, pourrais-tu illustrer avec un peu de code pour voir comment tu écris tes templates ?

    MAT.

  4. #4
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Citation Envoyé par dj.motte Voir le message

    Le fichier A.h contient des template, donc n'a pas pratiquement aucun développement dans un A.cpp.
    Tu coinces peut-être à ce niveau là. On ne fait pas de .cpp avec un template. Il faut considérer un .c ou .cpp comme une unité de code compilable, éventuellement en récupérant du code d'une autre fichier (.h). Un template n'est pas destiné à être compilé ; il sert à générer du code à la volée qui, lui, sera compilé, quand un template est instancié.

    Un template doit être entièrement défini dans un .h, c'est un code qui ne sert qu'à être utilisé dans un autre fichier, un template n'existe pas en lui même, il n'a de sens qu'une fois associé à une classe.

    Si ton template contient beaucoup de code, tu peux vouloir respecter un principe de séparation en-tête/code, à la manière des .h/.cpp. Normalement il te faut déclarer l'en-tête dans un .h et le corps des méthodes dans un autre fichier, avec l'extension de ton choix (.cxx et .tpp ont l'air assez populaires), fichier que tu incluras ensuite à la fin du .h, mais malheureusement à chaque fois que j'ai voulu essayer un truc de ce genre, ça a abominablement planté, impossible de trouver la bonne syntaxe.

    (N'oublie pas de mettre les gardes (#ifndef...#endif) dans le .h.)

  5. #5
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut
    Personnellement, je fais comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef XXX_H
    #define XXX_H
     
    template <typename T>
    class xxx
    {
       // bla bla
    };
     
    #include "xxx.tpp"
     
    #endif
    Ca marche tres bien

    EDIT : je ne met pas de #include "xxx.h" dans le .tpp

    Apo`

  6. #6
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Alors, je suis sous Visual C++ 2005 Express.

    Quand j'utilise un .cxx, VS le reconnais come étant un fihier de C++, avec coloration syntaxique, etc. => Plantage, à croire qu'il le reconnaît comme étant un fichier .cpp et qu'il essaie de le compiler .

    Mais quand j'utilise par contre un .tpp ou un .c++ (fallait bien tenter), par contre, il ne réagit pas à l'extension, le prend pour un fichier texte quelconque, l'inclus tranquillement dans le .h et ne pose pas de problème.

    Allez comprendre

  7. #7
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut
    Hmmm bizarre en effet...

    Moi je suis sous emacs donc.... je color comme je veux...
    Je testerais sous visual express pour voir ce qu'il en pense.

    Au moins le programme marche, c'est juste la coloration qu'il manque... ^^

    Apo`

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Apocalipsia propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    #ifndef XXX_H
    #define XXX_H
     
    template <typename T>
    class xxx
    {
       // bla bla
    };
     
    #include "xxx.tpp"
     
    #endif
    Bien d'accord. Mais si deux ou plus d'unités de compilation ont besoin de xxx.h c'est l'erreur de liaisons multiples qui revient.

    Par ex :

    g++ -o a a.cpp b.cpp c.cpp main.cpp

    si b.cpp et c.cpp ont besoin de xxx.h, comment faire ?

  9. #9
    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 dj.motte Voir le message
    Salut,

    Apocalipsia propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    #ifndef XXX_H
    #define XXX_H
     
    template <typename T>
    class xxx
    {
       // bla bla
    };
     
    #include "xxx.tpp"
     
    #endif
    Bien d'accord. Mais si deux ou plus d'unités de compilation ont besoin de xxx.h c'est l'erreur de liaisons multiples qui revient.

    Par ex :

    g++ -o a a.cpp b.cpp c.cpp main.cpp

    si b.cpp et c.cpp ont besoin de xxx.h, comment faire ?
    Tu as essayé au moins? Si tu as eu des problèmes, c'est que tu as plus dans le .tpp que les définitions des templates.

  10. #10
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Alors, je suis sous Visual C++ 2005 Express.

    Quand j'utilise un .cxx, VS le reconnais come étant un fihier de C++, avec coloration syntaxique, etc. => Plantage, à croire qu'il le reconnaît comme étant un fichier .cpp et qu'il essaie de le compiler .

    Mais quand j'utilise par contre un .tpp ou un .c++ (fallait bien tenter), par contre, il ne réagit pas à l'extension, le prend pour un fichier texte quelconque, l'inclus tranquillement dans le .h et ne pose pas de problème.

    Allez comprendre
    Va dans le menu Tools > Options > Text Editor > File Extension

    Tu rajoutes les extensions qui t'intéressent, et tu précises quelle coloration utiliser (en l'occurrence, Visual C++).

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,
    Tu as essayé au moins? Si tu as eu des problèmes, c'est que tu as plus dans le .tpp que les définitions des templates.
    Non je n'avais pas essayé par pessimisme. Mais je viens de faire un test et effectivement c'est une bonne solution. Cela semble même tourner avec une spécialisation du typename, dans l'inclus .tpp.

    Merci pour la réponse.

  12. #12
    Membre confirmé
    Homme Profil pro
    Activité
    Inscrit en
    Juillet 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Activité

    Informations forums :
    Inscription : Juillet 2005
    Messages : 94
    Par défaut
    Permettez-moi de vous suggérer cet article sur le sujet:

    http://moodle.polymtl.ca/file.php/29...ionSeparee.pdf

  13. #13
    Membre confirmé
    Homme Profil pro
    Activité
    Inscrit en
    Juillet 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Activité

    Informations forums :
    Inscription : Juillet 2005
    Messages : 94
    Par défaut
    Citation Envoyé par dj.motte Voir le message
    Salut,

    Apocalipsia propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    #ifndef XXX_H
    #define XXX_H
     
    template <typename T>
    class xxx
    {
       // bla bla
    };
     
    #include "xxx.tpp"
     
    #endif
    Bien d'accord. Mais si deux ou plus d'unités de compilation ont besoin de xxx.h c'est l'erreur de liaisons multiples qui revient.

    Par ex :

    g++ -o a a.cpp b.cpp c.cpp main.cpp

    si b.cpp et c.cpp ont besoin de xxx.h, comment faire ?
    La syntaxe proposée par Apocalipsia semble correcte.

  14. #14
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Va dans le menu Tools > Options > Text Editor > File Extension

    Tu rajoutes les extensions qui t'intéressent, et tu précises quelle coloration utiliser (en l'occurrence, Visual C++).
    Ce qui me turlupine en fait, c'est plutôt que VSC++ considère par défaut un .cxx comme étant un .cpp

  15. #15
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Ce qui me turlupine en fait, c'est plutôt que VSC++ considère par défaut un .cxx comme étant un .cpp
    Ah mince j'avais mal compris.
    Tu fais clic-droit sur Source Files (dans la vue arborescente du projet), et tu fais Properties. Il y aura un panneau ou tu pourras personnaliser tes filtres d'extension (Filter).

  16. #16
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Oui, effectivement.

    Je ne connais pas assez les autres environnements de développement pour réellement juger, mais VS a quand même l'air riche et élaboré (même s'il n'est pas forcément très ouvert au monde open source : C::B a des modèles de projet pour un grand nombre de bibliothèques, comme SDL, OpenGL, OGRE, Qt... ).

  17. #17
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Noxen écrit :
    Tu coinces peut-être à ce niveau là. On ne fait pas de .cpp avec un template. Il faut considérer un .c ou .cpp comme une unité de code compilable, éventuellement en récupérant du code d'une autre fichier (.h). Un template n'est pas destiné à être compilé ; il sert à générer du code à la volée qui, lui, sera compilé, quand un template est instancié.

    Un template doit être entièrement défini dans un .h, c'est un code qui ne sert qu'à être utilisé dans un autre fichier, un template n'existe pas en lui même, il n'a de sens qu'une fois associé à une classe.

    Si ton template contient beaucoup de code, tu peux vouloir respecter un principe de séparation en-tête/code, à la manière des .h/.cpp. Normalement il te faut déclarer l'en-tête dans un .h et le corps des méthodes dans un autre fichier, avec l'extension de ton choix (.cxx et .tpp ont l'air assez populaires), fichier que tu incluras ensuite à la fin du .h, mais malheureusement à chaque fois que j'ai voulu essayer un truc de ce genre, ça a abominablement planté, impossible de trouver la bonne syntaxe.
    De même. J'avais cru trouver la bonne méthode. Rien n'y fait. Le développement hors ligne des classes template du C++ reste un bourrin.

    C'est ainsi que le C++ s' embourbe dans le processus de sa manière d'emploi.

  18. #18
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Evidement l'inclusion du xxx.tpl dans le xxx.h est une erreur si dans l'inclus xxx.tpl il n'y a que des spécialisations de template.

  19. #19
    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
    Par défaut
    Pour l'ajout d'un cxx dans visual et ne pas le compiler, il suffit de l'exclure de la compilation.
    Sinon, sur les pbs de link et de spécialisations, cet après-midi.

Discussions similaires

  1. Réponses: 11
    Dernier message: 14/03/2007, 14h39
  2. Réponses: 6
    Dernier message: 29/11/2006, 11h56
  3. Créer un type matrice avec des templates
    Par souading3000 dans le forum C++
    Réponses: 2
    Dernier message: 15/06/2006, 11h24
  4. Liaison avec des images dans une table
    Par ValérieBruxelles dans le forum Access
    Réponses: 5
    Dernier message: 25/11/2005, 14h21
  5. Prbleme de liaison avec des doublons dans le fichier lié.
    Par krak70 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/10/2005, 11h03

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