Delen via


Compilerfout C2672

'functie': geen overeenkomende overbelaste functie gevonden

Opmerkingen

De compiler kan geen overbelaste functie vinden die overeenkomt met de opgegeven functie. Er is geen functie gevonden die overeenkomende parameters gebruikt of dat er geen overeenkomende functie de vereiste toegankelijkheid in de context heeft.

Wanneer deze worden gebruikt door bepaalde standaardbibliotheekcontainers of algoritmen, moeten uw typen toegankelijke leden of vriendfuncties bieden die voldoen aan de vereisten van de container of het algoritme. Uw iteratortypen moeten bijvoorbeeld worden afgeleid van std::iterator<>. Voor vergelijkingsbewerkingen of het gebruik van andere operators op containerelementtypen kan het type worden beschouwd als zowel een linker- als een rechteroperand. Gebruik van het type als een rechteroperand kan vereisen dat de operator wordt geïmplementeerd als een niet-lidfunctie van het type.

Voorbeeld

Versies van de compiler van vóór Visual Studio 2017 voerden geen toegangscontrole uit op gekwalificeerde namen in sommige sjablooncontexten. Dit kan het verwachte SFINAE-gedrag verstoren waarbij de vervanging naar verwachting mislukt vanwege de ontoegankelijkheid van een naam. Dit kan mogelijk een crash of onverwacht gedrag hebben veroorzaakt tijdens runtime omdat de compiler de verkeerde overbelasting van de operator onjuist aanroept. In Visual Studio 2017 wordt er een compilerfout gegenereerd.

Dit voorbeeld compileert in Visual Studio 2015, maar geeft een foutmelding in Visual Studio 2017. U kunt dit probleem oplossen door het lid van de sjabloonparameter toegankelijk te maken waar het wordt geëvalueerd.

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