Comment instancier explicitement une fonction de modèle?

117

J'ai une fonction de modèle avec un argument. Je dois instancier cette fonction sans appeler cette fonction signifie explicitement que je dois instancier.

J'ai cette fonction:

template <class T> int function_name(T a) {}

J'ai instancié cette fonction comme ceci:

template int function_name<int>(int);

Mais j'ai eu les erreurs suivantes:

error: expected primary-expression before 'template'
error: expected `;' before 'template'
Balaji
la source

Réponses:

182

[EDIT 2]: Notez qu'il y avait une certaine confusion concernant le code dans la question d'origine en raison de problèmes de formatage du code. Voir la réponse d'AnthonyHatchkins pour plus de détails.

Si vous voulez vraiment instancier (au lieu de spécialiser ou quelque chose) la fonction, procédez comme suit:

template <typename T> void func(T param) {} // definition

template void func<int>(int param); // explicit instantiation.

[EDIT] Il semble y avoir (beaucoup) de confusion concernant l'instanciation explicite et la spécialisation. Le code que j'ai publié ci-dessus traite de l'instanciation explicite . La syntaxe de la spécialisation est différente. Voici la syntaxe de la spécialisation:

template <typename T> void func(T param) {} // definition

template <> void func<int>(int param) {} // specialization

Notez que les crochets angulaires après le modèle!

hrnt
la source
3
qu'est-ce que l' instanciation ou la spécialisation ?
Nawaz
5
Pas vrai. Vous pouvez dire au compilateur d'instancier explicitement les modèles. Google pour "Instanciation de modèle explicite C ++" pour plus de détails.
hrnt
8
@Nawaz: vous vous trompez. Bien sûr, c'est toujours le compilateur qui instancie, cette ligne est une requête du programmeur au compilateur pour instancier le modèle. Si vous avez une copie de la norme C ++, lisez 14.7.2 Instanciation explicite
David Rodríguez - dribeas
16
La spécialisation signifie que vous modifiez probablement sa mise en œuvre. L'instanciation signifie simplement que vous l'assignez à une unité de compilation particulière, éventuellement pour prendre son adresse unique ou la rendre disponible en tant que fonction de bibliothèque ou pour réduire le gonflement.
CashCow
3
@hrnt: Je pense que vous avez raison. @Ashot: Je viens de remarquer que la syntaxe n'a pas de template<>forme. Ce qu'il a écrit est différent de la spécialisation . +1 pour m'avoir appris cette nouvelle chose. Je supprime mon message. : D
Nawaz
20

Votre code est correct.

Le message d'erreur concerne un endroit du code que vous n'avez pas cité ici.

Mettre à jour:

Le code d'origine était

template <class T> int function_name(T a) {}
template int function_name<int>(int);

et c'était correct.

Mais il n'a pas été cité et ressemblait donc à ceci:

template int function_name(T a) {}
template int function_name(int);

Il génère l'erreur suivante

a.cpp:1: error: explicit instantiation of non-template int function_name
a.cpp:1: error: expected `;' before ‘(’ token
a.cpp:3: error: function_name is not a template function

ce qui est clairement différent de ce qu'OP a cité.

Dans cette variante, la deuxième ligne est correcte ( <int>peut être omise ici), mais la première ligne est défectueuse. Le compilateur ne peut pas deviner qu'il Ts'agit d'un paramètre de modèle.

Antony Hatchkins
la source
Techniquement, ce n'était pas son code, c'était la modification de Bill :) Le code original est template int function_name( T a) { }ettemplate int function_name(int);
hrnt
@hrnt Le code d'origine n'était pas formaté correctement, mais il était correct. Si j'étais Balaji, je reviendrais et j'accepterais votre réponse s'il la juge utile, mais pour moi (et probablement pour n'importe qui d'autre) votre réponse (tout en ayant parfaitement raison en elle-même) ne répond pas à la question.
Antony Hatchkins
@hrnt Vous avez raison de dire que le code original ressemblait à ça. Mais à cause de l'argument de modèle déduit, cela fonctionne toujours. Je suis d'accord avec Antony Hatchkins pour dire que l'erreur provient d'un code que l'OP n'a pas cité, mais je pense que votre réponse est toujours utile pour les personnes qui ne connaissaient pas l'instanciation explicite.
mpark
Eh bien, prenez-moi par exemple. J'ai googlé cette page lorsque je voulais rafraîchir mes connaissances bien oubliées sur l'instanciation explicite - et cela ne m'a pas beaucoup aidé. Quant à moi, il n'y a aucune confusion sur la syntaxe. Ce qui peut prêter à confusion au sujet de l'instanciation explicite est son utilisation
Antony Hatchkins
@AntonyHatchkins Ah, c'est vrai - je n'ai pas regardé la source de la question originale, juste comment elle est apparue sur mon écran. Je vais attribuer +1 et modifier ma réponse initiale pour noter la confusion concernant la question initiale.
hrnt