Поделиться через


Ошибка компилятора C2672

"function": не найдена перегруженная функция сопоставления

Компилятор не смог найти перегруженную функцию, которая соответствует указанной функции. Функция не найдена, которая принимает соответствующие параметры или не имеет требуемой специальных возможностей в контексте.

При использовании определенных стандартных контейнеров или алгоритмов библиотеки типы должны предоставлять доступные члены или дружественные функции, удовлетворяющие требованиям контейнера или алгоритма. Например, типы итератора должны быть производными от std::iterator<>. Для операций сравнения или использования других операторов в типах элементов контейнера может потребоваться, чтобы тип считался как левым, так и правым операндом. Использование типа в качестве правого операнда может требовать реализации оператора в качестве функции, отличной от члена типа.

Пример

Версии компилятора до Visual Studio 2017 не выполняли проверку доступа на квалифицированные имена в некоторых контекстах шаблона. Это может помешать ожидаемой работе SFINAE там, где подстановка должна завершиться ошибкой из-за отсутствия доступа к имени. Такая ситуация может приводить к сбою или неожиданному поведению во время выполнения из-за того, что компилятор неправильно вызывает неверную перегрузку оператора. В Visual Studio 2017 выводится ошибка компилятора.

Этот пример компилируется в Visual Studio 2015, но вызывает ошибку в Visual Studio 2017. Чтобы устранить эту проблему, сделайте элемент параметра шаблона доступным для оценки.

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