Vide crochets dans la définition de modèle
Cette question a été à l'interview:
Fait ce code provoque une compilation/les erreurs de liaison et pourquoi donc?
template <int T> void f();
template <> void f<0>() {}
void test()
{
f<1>();
}
Veuillez expliquer le comportement. Merci beaucoup.
Erreur de couplage, vous avez besoin
template <int T> void f() { }
OriginalL'auteur Netherwire | 2014-05-21
Vous devez vous connecter pour publier un commentaire.
est à la spécialisation de la fonction de modèle pour l'argument
0
, si vous appelezf<0>()
cette version de la fonction sera appelée.Ce code est incorrect, il cause les erreurs de liaison, car il n'y a pas de spécialisation pour
f<1>
et de la version du modèle de fonction n'est pasdefined
.oui, puisque c'est la spécialisation,
template<>
points, que c'est plein de spécialisation de la fonction.OriginalL'auteur ForEveR
Compiler (tout le code est gramatically valide), mais échoue à la liaison.
C'est parce que
template <int T> void f();
est déclarée, mais pas défini, le <0> spécialisation est défini, mais qui ne fait pas de chances pour vous puisque vous n'êtes pas de son instanciation.En fait, il serait être possible pour le <0> la spécialisation à contenir des erreurs de syntaxe et le programme serait toujours compiler sans erreur! C'est parce que officiellement, les modèles sont compilé uniquement si elles sont utilisées. (Je ne m'attends pas à un candidat d'avoir la présence d'esprit au cours de l'entrevue conditions de le signaler.)
Non, c'est la partie de la norme.
Je dirais que même si c'est la partie de la norme, a <0> spécialisation contenant des erreurs de syntaxe seule compiler; il ne peut pas être garanti. Si elle contient un supplément inégalée
}
erreur de syntaxe, le compilateur peut avoir de la difficulté à déterminer où la définition de la fonction est censé prendre fin, à l'origine pour analyser de manière incorrecte en bas de la ligne.OriginalL'auteur Bathsheba
De compiler parce que le compilateur peut voir une déclaration pour un modèle générique. Il est entièrement spécialisée modèle pour 0 aussi. Mais nous l'appelons pour 1, qui va essayer d'invoquer le modèle générique, mais depuis l'éditeur de liens ne peut trouver aucune définition du modèle général, le programme va afficher l'éditeur de liens d'erreur.
Soloution
OriginalL'auteur TREMOR