Condividi tramite


Errore del compilatore C2672

'function': nessuna funzione di overload corrispondente trovata

Il compilatore non è riuscito a trovare una funzione di overload corrispondente alla funzione specificata. Non è stata trovata alcuna funzione che accetta parametri corrispondenti o nessuna funzione corrispondente ha l'accessibilità necessaria nel contesto.

Quando vengono usati da determinati algoritmi o contenitori di librerie standard, i tipi devono fornire membri o funzioni friend accessibili che soddisfano i requisiti del contenitore o dell'algoritmo. Ad esempio, i tipi di iteratore devono derivare da std::iterator<>. Le operazioni di confronto o l'uso di altri operatori sui tipi di elemento contenitore possono richiedere che il tipo sia sia un operando sinistro che un operando destro. L'uso del tipo come operando di destra può richiedere l'implementazione dell'operatore come funzione non membro del tipo.

Esempio

Le versioni del compilatore precedenti a Visual Studio 2017 non hanno eseguito il controllo di accesso sui nomi qualificati in alcuni contesti di modello. Ciò può interferire con il comportamento previsto per SFINAE in cui la sostituzione deve avere esito negativo a causa della non accessibilità di un nome. Questo potrebbe avere causato un arresto anomalo o un comportamento imprevisto in fase di esecuzione perché il compilatore ha chiamato per errore l'overload dell'operatore non corretto. In Visual Studio 2017 viene generato un errore del compilatore.

Questo esempio viene compilato in Visual Studio 2015 ma viene generato un errore in Visual Studio 2017. Per risolvere questo problema, rendere accessibile il membro del parametro del modello in cui viene valutato.

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