Supposons que j'ai déclaré:
template <typename T> void foo(T& t);
Maintenant, quelle est la différence entre
template <> void foo<int>(int& t);
et
template void foo<int>(int& t);
sémantiquement? Et les modèles sans parenthèses et les modèles avec parenthèses vides ont-ils d'autres sémantiques dans d'autres contextes?
Lié à: Comment puis-je forcer une instance particulière d'un modèle C++ à instancier?
template <> void foo<int>(int& t);
déclare un spécialisation du modèle, avec un corps potentiellement différent.
template void foo<int>(int& t);
provoque une instanciation explicite du modèle, mais n'introduit pas de spécialisation. Cela force juste l'instanciation du modèle pour un type spécifique.
Avec classe/struct,
template <typename T> struct foo {};
Voici une spécialisation:
template <> struct foo<int>{};
Voici une instanciation explicite:
template struct foo<int>;