Échec de l'ADL dans la recherche de modèles de fonctions
En C, la recherche dépendante de l'argument (ADL) permet la recherche de déclarations de noms de fonctions dans le espaces de noms associés aux arguments dans un appel de fonction. Cependant, il existe une restriction dans la spécification C en ce qui concerne les modèles de fonctions et l'ADL.
La restriction
Selon la norme C 14.8.1.6, l'ADL ne s'applique aux modèles de fonction, sauf s'il existe un modèle de fonction visible portant le même nom au moment de l'appel. Cela signifie que, pour les modèles de fonction avec des arguments de modèle explicites, l'appel doit avoir la forme syntaxique correcte avec un modèle de fonction visible.
Exemple
Considérez l'exemple suivant :
namespace ns { struct foo {}; template<int i> void frob(foo const&) {} void non_template(foo const&) {} } int main() { ns::foo f; non_template(f); // This is fine. frob<0>(f); // This is not. }
Dans cet exemple, ADL trouve et résout non_template pour le premier appel car non_template est une fonction ordinaire. Cependant, pour le deuxième appel, frob est un modèle de fonction. Puisqu'il n'y a pas de modèle de fonction frob visible au moment de l'appel, ADL échoue et l'appel n'est pas syntaxiquement bien formé.
Réponse à la restriction
À Pour surmonter cette restriction, assurez-vous que le modèle de fonction est visible dans la portée de l'appel. Ceci peut être réalisé en déclarant le modèle de fonction dans l'espace de noms actuel ou en qualifiant l'appel avec l'espace de noms contenant le modèle de fonction.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!