Compartir a través de


Error del compilador C2672

"function": no se encontró una función sobrecargada que coincida

El compilador no ha encontrado una función sobrecargada que coincida con la función especificada. No se ha encontrado ninguna función que tome parámetros coincidentes, o bien ninguna función coincidente tiene la accesibilidad necesaria en el contexto.

Cuando sus tipos se usan en determinados algoritmos o contenedores de bibliotecas estándar, deben proporcionar funciones de confianza o miembros accesibles que cumplan los requisitos del contenedor o algoritmo. Por ejemplo, los tipos de iterador deben derivarse de std::iterator<>. Las operaciones de comparación o el uso de otros operadores en tipos de elementos contenedor pueden requerir que el tipo se considere un operando tanto izquierdo como derecho. El uso del tipo como operando derecho puede requerir la implementación del operador como una función no miembro del tipo.

Ejemplo

Las versiones del compilador anteriores a Visual Studio 2017 no realizaban la comprobación de acceso en nombres completos en algunos contextos de plantilla. Esto puede interferir con el comportamiento esperado de SFINAE, ya que se espera un error en la sustitución debido a la inaccesibilidad de un nombre. Esto podría haber provocado un bloqueo o un comportamiento inesperado en tiempo de ejecución, ya que el compilador hubiera llamado incorrectamente a la sobrecarga incorrecta del operador. En Visual Studio 2017, se genera un error del compilador.

El siguiente código se compila en Visual Studio 2015, pero genera un error en Visual Studio 2017. Para corregir este problema, haga que el miembro del parámetro de plantilla sea accesible donde se evalúa.

#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.
}