내 코드 또는 컴파일러 (가능하지 않은)에서 문제가 무엇인지 이해하지 못합니다. 다음과 같은 코드가 있습니다.
#include <iostream>
#include <type_traits>
#include <set>
template<typename T, typename = void>
struct TestA: std::false_type {};
template<typename T>
struct TestA<T, std::void_t<typename T::reverse_iterator>> : std::true_type {};
template<typename T>
struct TestA<T, std::void_t<typename T::dummy_iterator>> : std::true_type {};
int main()
{
std::cout << TestA<std::set<int>>::value;
}
GCC와 MSVC 모두 컴파일합니다. 다른 버전의 GCC와 MSVC 17 (local) 및 19를 사용하여 godbolt에서 테스트했습니다. 다음 링크는 https://godbolt.org/z/Enfm6L 입니다.
그러나 Clang은 컴파일하지 않고 오류를 발생시킵니다.
redefinition of `'TestA<T, std::void_t<typename T::dummy_iterator> >'`
그리고 관심이 있습니다.이 코드 조각이 틀리거나 다른 것이 표준의 일부일 수 있습니다.
어떻게하다 "표준 : 세트 :: reverse_iterator" 및 "표준 : : 설정 : dummy_iterator" 그 소리 헤더에 정의?
—
mvidelgauz
std :: set :: dummy_iterator는 clang 헤더에 전혀 정의되어 있지 않습니다 (희망합니다). dummy_iterator를 원하는대로 변경할 수 있으며 아래에 표시된 것처럼 문제가 정의에 없으므로 결과가 변경되지 않습니다.
—
Andrei
감사합니다 Andrei, 나는 답변을 읽고 정말 흥미 롭습니다
—
mvidelgauz