web-dev-qa-db-fra.com

"modèle <>" vs "modèle" sans crochets - quelle est la différence?

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?

71
einpoklum

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.

66
Mark B

Avec classe/struct,

template <typename T> struct foo {};

Voici une spécialisation:

template <> struct foo<int>{};

Voici une instanciation explicite:

template struct foo<int>;
12
Jarod42