web-dev-qa-db-fra.com

Comment instancier explicitement une fonction de modèle?

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'
109
Balaji

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

Si vous voulez vraiment instancier (au lieu de spécialiser ou autre 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 posté ci-dessus concerne instanciation explicite. La syntaxe pour spécialisation est différente. Voici la syntaxe pour la spécialisation:

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

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

Notez que les angles entre les gabarits!

169
hrnt

Votre code est correct.

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

Mise à jour:

Le code original é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 ainsi ressemblait à 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 que l'OP cité.

Dans cette variante, la deuxième ligne est ok (<int> _ peut être omis ici), mais la première ligne est défectueuse. Le compilateur ne peut pas deviner que T est un paramètre de modèle.

20
Antony Hatchkins