web-dev-qa-db-fra.com

Crochets vides dans la définition du modèle

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.

15
Netherwire
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.

17
ForEveR

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.)

5
Bathsheba

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>();
}
0
TREMOR