Udostępnij za pośrednictwem


Błąd kompilatora C2672

"function": nie znaleziono pasującej przeciążonej funkcji

Kompilator nie może odnaleźć przeciążonej funkcji zgodnej z określoną funkcją. Nie znaleziono funkcji, która przyjmuje pasujące parametry lub żadna zgodna funkcja nie ma wymaganych ułatwień dostępu w kontekście.

W przypadku użycia przez niektóre standardowe kontenery lub algorytmy biblioteki typy muszą zapewniać dostępne elementy członkowskie lub funkcje przyjazne, które spełniają wymagania kontenera lub algorytmu. Na przykład typy iteratorów powinny pochodzić z klasy std::iterator<>. Operacje porównania lub użycie innych operatorów w typach elementów kontenera mogą wymagać, aby typ był traktowany zarówno jako lewy, jak i prawy operand. Użycie typu jako operandu po prawej stronie może wymagać implementacji operatora jako funkcji innej niż składowa typu.

Przykład

Wersje kompilatora przed programem Visual Studio 2017 nie przeprowadziły sprawdzania dostępu na kwalifikowanych nazwach w niektórych kontekstach szablonu. Może to zakłócać oczekiwane zachowanie SFINAE, gdy oczekuje się, że podstawianie nie powiedzie się z powodu niedostępności nazwy. Mogło to spowodować awarię lub nieoczekiwane zachowanie w czasie wykonywania ze względu na niepoprawne wywołanie nieprawidłowego przeciążenia operatora przez kompilator. W programie Visual Studio 2017 jest zgłaszany błąd kompilatora.

Ten przykład kompiluje się w programie Visual Studio 2015, ale zgłasza błąd w programie Visual Studio 2017. Aby rozwiązać ten problem, udostępnij element członkowski parametru szablonu w miejscu jego oceny.

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