Freigeben über


Compilerfehler C2672

function“: Es wurde keine übereinstimmende überladene Funktion gefunden

Der Compiler konnte keine überladene Funktion finden, die der angegebenen Funktion entspricht. Es wurde keine Funktion gefunden, die übereinstimmende Parameter akzeptiert, oder keine Übereinstimmende Funktion verfügt über die erforderliche Barrierefreiheit im Kontext.

Wenn Sie von bestimmten Standardbibliothekcontainern oder Algorithmen verwendet werden, müssen Ihre Typen barrierefreie Member oder Freundesfunktionen bereitstellen, die den Anforderungen des Containers oder Algorithmus entsprechen. Ihre Iteratortypen sollten z. B. von std::iterator<>. Vergleichsvorgänge oder die Verwendung anderer Operatoren für Containerelementtypen erfordern möglicherweise, dass der Typ sowohl als links- als auch als rechtsseitiger Operand betrachtet wird. Die Verwendung des Typs als rechtshändiger Operand kann die Implementierung des Operators als Nicht-Member-Funktion des Typs erfordern.

Beispiel

Versionen des Compilers vor Visual Studio 2017 haben in einigen Vorlagenkontexten keine Zugriffsüberprüfung für qualifizierte Namen durchgeführt. Das erwartete SFINAE-Verhalten kann behindert werden, in dem die Ersetzung aufgrund der Nichterreichbarkeit des Namens erwartungsgemäß fehlschlägt. Dies kann potenziell einen Absturz oder unerwartetes Verhalten zur Laufzeit auslösen, da der Compiler fälschlicherweise die falsche Überladung des Operators aufgerufen hat. In Visual Studio 2017 wird ein Compilerfehler ausgelöst.

In diesem Beispiel wird in Visual Studio 2015 kompiliert, in Visual Studio 2017 wird jedoch ein Fehler ausgelöst. Um dieses Problem zu beheben, machen Sie das Vorlagenparameterelement barrierefrei, wo es ausgewertet wird.

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