Ошибка компилятора 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.
}