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

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

Linda Hamilton
Linda Hamilton원래의
2024-11-12 10:08:02344검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.