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 :

Templates & inline


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Templates & inline
    Bonjour,

    Sujet récurrent, mais j'ai du mal à choper une réponse claire dans mes recherches sur Google :

    Y a-t-il des cas où il est possible d'implémenter des fonctions membres de classes template, sans avoir à les déclarer inline ?

    Merci.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Bonsoir,

    La réponse se trouve dans les règles de l'ODR (One Definition Rules), donc dans la norme (ou un draft, elles doivent pas avoir vraiment changé au fil du temps).

    Pour en résumer une partie (ca concerne plus de chose que seulement les fonctions membres) : il faut inliner les fonctions membres templates d'une classe non-template, sinon pas d'obligation d'inliner.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    il faut inliner les fonctions membres templates d'une classe non-template, sinon pas d'obligation d'inliner.
    Donc, quand on a une classe template, et que ses méthodes membres n'ont pas de paramètres template qui lui sont propres, il n'est pas obligatoire de les inliner dans le but d'éviter des soucis d'édition de lien ?

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Quel est le problème? Le constructeur de Bar n'est pas inline dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <typename T> class Bar
    {
    public:
        Bar();
    };
     
    template <typename T> Bar<T>::Bar()
    {
    }

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    salut,
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Quel est le problème? Le constructeur de Bar n'est pas inline dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <typename T> class Bar
    {
    public:
        Bar();
    };
     
    template <typename T> Bar<T>::Bar()
    {
    }
    Non, mais, sauf erreur de ma part, l'éditeur de liens ralera si tu utilise Bar avec le meme paramètre template dans deux fichiers *.cpp différent sous prétèxte qu'il trouve un symbole défini de manière multiple
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    @koala: Normalement non :
    There can be more than one definition of a [...] member function of a class template (14.5.1.1)
    Il peut y avoir plus d'une définition [Note : Dans l'ensemble du programme, dans un TU c'est toujours exactement une] [...] d'une fonction membre d'une classe template.
    @oodini: A partir du moment où ta classe est template tu n'as rien à inliner, c'est quand elle n'est pas template que tu as besoin d'inliner.

    Pour être exact dans le cas d'une classe non template les fonctions membres non inline ne doivent être définies qu'une seul fois, pas de problème pous les fonctions membres non template car on peut les mettre dans une fichier d'implémentation, mais avec une fonction membre template ce n'est pas vraiment possible de faire cette séparation (je passe volontairement sous silence export), ainsi le fait de la passer en inline permet de la définir plusieurs fois, et donc de la définir dans le header.

  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 Flob90 Voir le message
    @koala: Normalement non :
    C'est pas ce que j'aurais cite (on pourrait avoir plusieurs definitions du template tout en ne permettant qu'une instantiation).

    Le fait est que les instantiations ont lieu logiquement pendant l'edition de liens (en phase 8), meme si en pratique le plus souvent elles ont lieu pour chaque unite de compilation et l'editeur de liens ignore les doublons.

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    ouppsss... au temps pour moi...

    Il me semblait pourtant avoir déjà été confronté à des erreurs de l'éditeur de liens lorsque les fonctions templates n'étaient pas inlinées (que ce soit de manière implicite ou explicite).

    Je viens de vérifier avec un exemple simple, et cela marche en effet tout à fait correctement
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  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 koala01 Voir le message
    ouppsss... au temps pour moi...

    Il me semblait pourtant avoir déjà été confronté à des erreurs de l'éditeur de liens lorsque les fonctions templates n'étaient pas inlinées (que ce soit de manière implicite ou explicite).

    Je viens de vérifier avec un exemple simple, et cela marche en effet tout à fait correctement
    Avec des bibliotheques dynamiquement liees peut-etre? (J'ai jamais eu de probleme sous Unix dans ce cas, mais la gestion des bibliotheques dynamiques varie deja pas mal entre les differents Unix ca me semble donc etre la source la plus vraisemblable d'un probleme de ce genre)

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Avec des bibliotheques dynamiquement liees peut-etre? (J'ai jamais eu de probleme sous Unix dans ce cas, mais la gestion des bibliotheques dynamiques varie deja pas mal entre les differents Unix ca me semble donc etre la source la plus vraisemblable d'un probleme de ce genre)
    Ce n'est pas du tout exclu ...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Merci à tous pour votre participation !
    C'est dorénavant beaucoup plus clair.

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

Discussions similaires

  1. Include et template/inline
    Par zenux dans le forum Débuter
    Réponses: 3
    Dernier message: 27/10/2010, 19h31
  2. Réponses: 4
    Dernier message: 09/09/2010, 18h14
  3. Réponses: 4
    Dernier message: 25/06/2009, 00h37
  4. [Turbo C++] Fonciton containing for are not expanded inline
    Par BuG dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 17/02/2003, 06h48
  5. [XSLT] template
    Par demo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/09/2002, 11h31

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