Erro do compilador C2672
'função': nenhuma função sobrecarregada correspondente encontrada
O compilador não encontrou uma função sobrecarregada que corresponda à função especificada. Não foi encontrada nenhuma função que usa parâmetros correspondentes ou nenhuma função correspondente tem a acessibilidade necessária no contexto.
Quando usados por determinados contêineres ou algoritmos de biblioteca padrão, seus tipos devem fornecer membros acessíveis ou funções amigas que satisfaçam os requisitos do contêiner ou algoritmo. Por exemplo, seus tipos de iterador devem derivar de std::iterator<>
. As operações de comparação ou o uso de outros operadores em tipos de elemento de contêiner podem exigir que o tipo seja considerado como um operando à esquerda e à direita. O uso do tipo como um operando à direita pode exigir a implementação do operador como uma função não membro do tipo.
Exemplo
As versões do compilador anteriores ao Visual Studio 2017 não realizavam a verificação de acesso em nomes qualificados em alguns contextos de modelo. Isso pode interferir no comportamento SFINAE esperado quando a substituição deve falhar devido à inacessibilidade de um nome. Eventualmente, isso poderia ter causado uma falha ou comportamento inesperado no runtime devido ao compilador ter chamado incorretamente a sobrecarga errada do operador. No Visual Studio 2017, é gerado um erro do compilador.
Este exemplo é compilado no Visual Studio 2015, mas gera um erro no Visual Studio 2017. Para corrigir esse problema, torne o membro do parâmetro de modelo acessível onde ele é avaliado.
#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.
}