> 백엔드 개발 > C++ > 본문

템플릿 인수에 'enable_if_t'를 사용하면 재정의 오류가 발생하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-12 10:08:02
원래의
311명이 탐색했습니다.

Why Does Using `enable_if_t` in Template Arguments Lead to Redefinition Errors?

템플릿 인수의 활성화_if_t가 재정의 오류를 일으키는 이유

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() { }
로그인 후 복사

오류가 발생하는 이유는 두 번째 템플릿 인수의 기본값이 다르더라도 템플릿은 여전히 ​​동일한 유형인 templatevoid()입니다. 이는 서로 다른 기본 int 값을 갖는 두 개의 함수 print(string, int)를 갖는 것과 동일하며 이는 오버로드에 적합하지 않습니다.

문제를 해결하려면 템플릿 인수에서 활성화_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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿