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.
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.
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.
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() { }
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
@koala: Normalement non :
There can be more than one definition of a [...] member function of a class template (14.5.1.1)@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.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.
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.
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.
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
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
Merci à tous pour votre participation !
C'est dorénavant beaucoup plus clair.
Partager