Dela via


Kompilatorfel C2672

"funktion": ingen matchande överlagrade funktion hittades

Anmärkningar

Kompilatorn kunde inte hitta en överbelastad funktion som matchar den angivna funktionen. Det gick inte att hitta någon funktion som tar matchande parametrar, eller så har ingen matchande funktion den tillgänglighet som krävs i kontexten.

När de används av vissa standardbibliotekscontainrar eller algoritmer måste dina typer tillhandahålla tillgängliga medlemmar eller vänfunktioner som uppfyller kraven för containern eller algoritmen. Iteratortyperna bör till exempel härledas från std::iterator<>. Jämförelseoperationer eller användning av andra operatorer på containerelementtyper kan kräva att typen betraktas som både en vänster- och en högeroperand. Användning av typen som en högeroperator kan kräva implementering av operatorn som en icke-medlemsfunktion av typen.

Exempel

Versioner av kompilatorn före Visual Studio 2017 utförde inte åtkomstkontroll av kvalificerade namn i vissa mallkontexter. Detta kan störa förväntat SFINAE-beteende där ersättningen förväntas misslyckas på grund av ett namns otillgänglighet. Detta kan eventuellt ha orsakat en krasch eller ett oväntat beteende under körning eftersom kompilatorn felaktigt anropade felaktig överbelastning av operatorn. I Visual Studio 2017 utlöses ett kompilatorfel.

Det här exemplet kompileras i Visual Studio 2015 men genererar ett fel i Visual Studio 2017. Åtgärda problemet genom att göra mallparametermedlemmen tillgänglig där den utvärderas.

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