C에서 std::enable_if는 템플릿 인수의 조건부 유형 선택에 사용됩니다. 최신 구문 typename std::enable_if_t<...> typename std::enable_if<...>::type* 대신 컴파일러에서 재정의 오류가 발생할 수 있습니다.
이유를 이해하려면 다음 코드를 고려하세요.
template<typename T, typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr> void f() { } template<typename T, typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr> void f() { }
이것은 코드는 T가 int인지 double인지에 따라 f를 오버로드하는 두 개의 템플릿을 선언합니다. 그러나 std::enable_if_t를 사용하도록 코드를 업데이트하면 재정의 오류가 발생합니다.
template<typename T, typename = std::enable_if_t<std::is_same<int, T>::value>> void g() { } template<typename T, typename = std::enable_if_t<std::is_same<double, T>::value>> void g() { }
오류가 발생하는 이유는 두 번째 템플릿 인수의 기본값이 다르더라도 템플릿은 여전히 동일한 유형인 template
문제를 해결하려면 템플릿 인수에서 활성화_if 절을 제거하고 typename을 클래스로 바꾸세요.
template<class T, class U /* = std::enable_if_t<std::is_same<int, T>::value> */> void g() { } template<class T, class U /* = std::enable_if_t<std::is_same<double, T>::value> */> void g() { }
또는 두 번째 템플릿 인수에 대해 다른 유형을 지정할 수 있습니다.
template<class T, std::enable_if_t<std::is_same<int, T>::value, int> = nullptr> void g() { } template<class T, std::enable_if_t<std::is_same<double, T>::value, int> = nullptr> void g() { }
위 내용은 템플릿 인수에 'enable_if_t'를 사용하면 재정의 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!