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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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++).

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

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

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