Cette question était lors de l'entretien: Ce code provoque-t-il des erreurs de compilation/liaison et pourquoi?
template <int T> void f();
template <> void f<0>() {}
void test()
{
f<1>();
}
S'il vous plaît expliquer le comportement. Merci beaucoup.
template<> void f<0>() {}
est la spécialisation du modèle de fonction pour l'argument 0
, si vous appelez f<0>()
, cette version de la fonction sera appelée.
Ce code est incorrect, il provoque des erreurs de liaison, car il n'y a pas de spécialisation pour f<1>
et la version de modèle de la fonction n'est pas defined
.
Il se compilera (tout le code est grammaticalement valide) mais échouera au stade de la liaison.
En effet, template <int T> void f();
est déclaré mais pas est défini, la <0> spécialisation est est défini, mais cela ne vous donne aucune chance, car vous ne l'instanciez pas.
En fait, il serait il serait possible que la spécialisation <0> contienne des erreurs de syntaxe et le programme serait toujours compilé sans erreur! En effet, les modèles ne sont compilés que s’ils sont utilisés. (Je ne m'attendrais pas à ce qu'un candidat ait la présence d'esprit pendant les conditions de l'entretien pour le signaler.)
Il va compiler car le compilateur peut voir une déclaration pour un modèle générique. Il existe également un modèle entièrement spécialisé pour 0. Mais nous l'appelons pour 1, qui essaiera d'appeler le modèle générique, mais comme l'éditeur de liens ne trouve aucune définition pour le modèle général, le programme affichera une erreur de l'éditeur de liens.
Soloution
template <int T> void f();
template <> void f<0>() {}
template <int T> void f() { }
void test()
{
f<1>();
}