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 :

Compilation séparée de classes template


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Arabie Saoudite

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 51
    Par défaut Compilation séparée de classes template
    Bonsoir à tous,

    Comme je ne l'ai jamais fait auparavant, je voudrai voir (au moins une fois) comment est ce qu'on peut séparer dans deux fichiers (un .h et et .cpp) la compilation d'une classe template. Suite à la lecture de quelques articles en ligne, j'en suis arrivé à l'organisation suivante des deux fichiers :

    Dans le header que je nomme C.h j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <typename T> class C
    {
        T attrbut1
        std::vector<C*> attribut2
     
    public:
     
        //constructeur et méthodes
     
    };

    Dans le C.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
    19
    20
    21
    #include "C.h"
     
    template class C<int>;
    template class C<float>;
    template class C<std::string>;
    template class C<double>;
    template class C<char>;
     
    template class C<int*>;
    template class C<float*>;
    template class C<std::string*>;
    template class C<double*>;
    template class C<char*>;
     
    //Exemple d'implémentation d'une méthode :
    template <typename T>
    C<T>* C<T>::f(int pos)const
    {
        // Traitement
        return …. ;
    }

    Dans le main, je fais un include du C.h avec #include "C.h", et j'utilise la classe comme ci j'avais défini tout le corps de ma classe dans le .h Par exemple, j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C<int>* var=new C<int>(12);
    Malheureusement, quand je compile, j'ai à peu près 11 erreurs de link.

    Y a-t-il quelque chose qui m'échappe encore ?

    Bien cordialement.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 760
    Par défaut
    Citation Envoyé par souki22 Voir le message
    Y a-t-il quelque chose qui m'échappe encore ?
    Oui

    Avec les templates [patrons], il faut qu'à la compilation, le compilateur ait à la fois la déclaration mais aussi l'implémentation.

    Une technique (mais je ne connais pas d'autres )
    Il faut avoir 3 fichiers: .h ou .hpp, .cpp et .tpp

    Les fichiers .h ou .hpp et .cpp tu maitrises
    Tu mets toute implémentation de tes templates dans le fichier .tpp et à la fin de tes entêtes [.h ou .hpp] tu mets #include "XXX.tpp".

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Il faut bien voir que l'implémentation d'une template de classe ou de fonction n'est pas ce que tu écris toi.
    Ce sera le code généré par le compilateur.
    Tu n'écris qu'un modèle, qui est nécessaire pendant la phase de compilation proprement dite.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Arabie Saoudite

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 51
    Par défaut
    J'ai essayé de faire ça mais malheureusement ça ne marche pas. Plus exactement, je suis sous Mac et j'utilise Xcode. Il s'avère que quand je faias "nouveau fichier", Xcode me propose trois types de fichiers seulement avec des extensions prédéfinies: header, fichier C, ou fichier C++.
    Pour tenter ce qui a été proposé, j'ai choisi "fichier C++" et j'ai renommé en XXX.tpp. Le fichier est alors créé mais avec l'extension XXX.tpp.cpp. Et quand je fais un #include "XXX.tpp" ou que je fais #include "XXX.tpp.cpp" à l'avant dernière ligne du fichier XXX.h, je reçois une erreur comme quoi le fichier inclus n'a pas été reconnu.


  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 760
    Par défaut
    Tu sais ce n'est pas interdit de passer par l'explorer

    Tu crées un nouveau fichier ou mieux encore tu copies-colles un fichier source existant (*), tu le renommes en "XXX.tpp" et ensuite tu l'inclus dans XCode -> "Ajouter un fichier existant" ou un menu rapprochant


    * -> De cette façon tu es sûr que tu as un fichier en UTF-8

    Édit Sauvage, message en dessous:
    Citation Envoyé par souki22 Voir le message
    surtout pas dans le répertoire où sont les fichiers
    Répliques célébres:
    • Elle va marcher beaucoup moins bien forcément
    • Que c'est ballot


    Tu crées un fichier avec un XCode et tu le renommes comme un sauvageon dans ton explorer
    Teins XCode n'a pas bronché

  7. #7
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Arabie Saoudite

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 51
    Par défaut
    C bon ça a marché

    En fait, faut créer un fichier cpp (même .h marche je pense mais je n'ai pas essayé) puis renommer le fichier dans la colonne à gauche de l'interface de Xcode où les différents fichiers de code sont listés (surtout pas dans le répertoire où sont les fichiers).

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    En l'occurence il s'agit d'un fichier header, puisqu'il à pour but d'être include. Donc choisir un fichier .cpp est le "pire choix".
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/07/2012, 18h53
  2. Réponses: 4
    Dernier message: 22/11/2010, 14h15
  3. compilation séparée et vector membre d'une classe
    Par Collision dans le forum Débuter
    Réponses: 2
    Dernier message: 11/04/2009, 21h08
  4. Classe template - erreur compilation
    Par Rodrigue dans le forum Langage
    Réponses: 5
    Dernier message: 06/07/2006, 17h26
  5. [Class compilées]Insertion de class compilées:
    Par Toulzac dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 28/06/2004, 13h58

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