템플릿 인수 충돌: 정의에서 활성화_if_t가 실패하는 이유
템플릿 프로그래밍에서는 조건부 활성화가 필요한 상황에 직면하는 것이 드문 일이 아닙니다. 또는 특정 조건에 따라 템플릿 기능을 비활성화합니다. 이러한 경우 이를 달성하기 위해 std::enable_if 템플릿이 자주 사용됩니다. 그러나 최근 std::enable_if_t의 새로운 구문을 사용하려는 시도로 인해 예상치 못한 오류가 발생했습니다.
아래 코드 조각에서는 std::enable_if:
를 사용하여 두 개의 템플릿 함수 f()를 정의합니다.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() { }
새로운 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() { }
GCC에서 다음 오류가 표시됩니다.
error: redefinition of 'template<class T, class> void g()' void g() { }
이 오류가 발생하는 이유를 이해하려면 템플릿 인수의 구문을 조사해야 합니다. 불필요한 코드를 제거하여 함수를 다음과 같이 단순화하여 표현했습니다.
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
이 문제를 해결하려면 두 번째 인수를 종속 유형이 있는 포인터 유형으로 변경할 수 있습니다.
template< class T, std::enable_if_t<std::is_same<int, T>::value, int>* = nullptr > void f() { } template< class T, std::enable_if_t<std::is_same<double, T>::value, int>* = nullptr > void f() { }
이 수정된 코드에서는 이제 템플릿 함수의 서명이 고유해 충돌이 제거되고 올바른 템플릿 일치가 가능해졌습니다.
위 내용은 함수 정의에서 'enable_if_t'가 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!