Ai-je besoin de fonctions de modèle inline
si elles sont incluses dans plusieurs fichiers cpp
? Merci.
template<bool> inline QString GetText();
template<> inline QString GetText<true>() {return "true";}
template<> inline QString GetText<false>() {return "false";}
Vous le faites, car il s’agit de spécialisations complètes, et donc soumises à la règle de définition unique, tout comme les fonctions normales.
Oui, vous avez besoin du spécificateur inline
.
La règle de définition unique (ODR) stipule qu'il doit exister une seule définition d'une variable, fonction, classe, énumération ou modèle. Les exceptions pertinentes pour votre question sont énumérées au § 3.2/5 (C++ 11) (c'est moi qui souligne):
Il peut exister plus d'une définition d'un type de classe (article 9), type d'énumération (7.2), fonction en ligne avec liaison externe (7.1.2), modèle de classe (article 14), modèle de fonction non statique (14.5.6). , membre de données statique d’un modèle de classe (14.5.1.3), fonction membre d’un modèle de classe (14.5.1.1) ou spécialisation de modèle pour laquelle certains paramètres de modèle ne sont pas spécifiés (14.7, 14.5.5) dans programme à condition que chaque définition apparaisse dans une unité de traduction différente et à condition que les définitions satisfassent aux exigences suivantes [...]
Les spécialisations de modèles pour lesquelles les paramètres all sont spécifiés (c’est-à-dire les spécialisations explicites) ne sont pas répertoriées dans cette liste, et le paragraphe 14.7.3/12 indique:
Une spécialisation explicite d’un modèle de fonction n’est en ligne que si elle est déclarée avec le spécificateur inline ou définie comme étant supprimée, et que sa fonction soit ou non indépendante le modèle est en ligne. [ Exemple:
template<class T> void f(T) { /∗ ... ∗/ } template<class T> inline T g(T) { /∗ ... ∗/ } template<> inline void f<>(int) { /∗ ... ∗/ } // OK: inline template<> int g<>(int) { /∗ ... ∗/ } // OK: not inline
- fin exemple]
Il n’existe aucune raison pour la déclaration de modèle en ligne, mais pas pour la spécialisation complète de modèle, vous n'avez pas besoin d'ajouter le mot clé inline pour la première ligne, mais les deuxième et troisième en ont besoin .. template, doit contenir la définition du template, le mieux est donc de l'inclure dans le fichier d'en-tête et de l'inclure dans les autres cpps qui l'utilisent.
Dans la norme C++ n3376 pour 3.2/6, il peut exister plusieurs définitions de modèle de classe pour l'ensemble de l'application, étant donné que la définition est la même.
===============
Mise à jour de la base de réponses sur Jesse Bons commentaires, (besoin en ligne pour la spécialisation complète du modèle) Merci Jesse Bon de le signaler.
Il semble que la méthode template doit être définie dans le même fichier que celui en cours de construction. Vous n'avez pas besoin d'utiliser le mot clé 'inline' car ils ont été générés dans chaque fichier cpp qui l'inclut.