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.
Partager