Erreur du compilateur C2672
'function' : aucune fonction surchargée correspondante trouvée
Le compilateur n’a pas pu trouver une fonction surchargée qui correspond à la fonction spécifiée. Aucune fonction n’a été trouvée qui accepte les paramètres correspondants, ou aucune fonction correspondante n’a l’accessibilité requise dans le contexte.
Lorsqu’ils sont utilisés par certains conteneurs ou algorithmes de bibliothèque standard, vos types doivent fournir des fonctions membres ou amis accessibles qui répondent aux exigences du conteneur ou de l’algorithme. Par exemple, vos types d’itérateurs doivent dériver de std::iterator<>
. Les opérations de comparaison ou l’utilisation d’autres opérateurs sur les types d’éléments de conteneur peuvent nécessiter que le type soit considéré comme un opérande de gauche et de droite. L’utilisation du type comme opérande de droite peut nécessiter l’implémentation de l’opérateur en tant que fonction non membre du type.
Exemple
Les versions du compilateur antérieures à Visual Studio 2017 n’ont pas effectué d’accès case activée ing sur les noms qualifiés dans certains contextes de modèle. Cela peut interférer avec le comportement attendu de la fonctionnalité SFINAE où la substitution est supposée échouer en raison de l’inaccessibilité d’un nom. Cette situation peut entraîner un incident ou un comportement inattendu au moment de l’exécution en raison de l’appel par le compilateur de la surcharge incorrecte de l’opérateur. Dans Visual Studio 2017, une erreur de compilateur est générée.
Cet exemple compile dans Visual Studio 2015, mais génère une erreur dans Visual Studio 2017. Pour résoudre ce problème, rendez le membre de paramètre de modèle accessible à l’endroit où il est évalué.
#include <type_traits>
template <class T> class S {
// public: // Uncomment this line to fix
typedef typename T type;
};
template <class T, std::enable_if<std::is_integral<typename S<T>::type>::value, T> * = 0>
bool f(T x)
{
return (x == 0);
}
int main()
{
f(10); // C2672: No matching overloaded function found.
}