다음을 통해 공유


컴파일러 오류 C2672

'function': 일치하는 오버로드된 함수를 찾을 수 없음

컴파일러에서 지정된 함수와 일치하는 오버로드된 함수를 찾을 수 없습니다. 일치하는 매개 변수를 사용하는 함수가 없거나 컨텍스트에서 필요한 접근성이 일치하는 함수가 없습니다.

특정 표준 라이브러리 컨테이너 또는 알고리즘에서 사용하는 경우 형식은 컨테이너 또는 알고리즘의 요구 사항을 충족하는 액세스 가능한 멤버 또는 friend 함수를 제공해야 합니다. 예를 들어 반복기 형식은 .에서 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.
}