이 간단한 템플릿 특수화를 고려부분 템플릿 특수화 : MSVS
template<typename T, size_t I>
struct S {};
template<typename T>
struct S<T, std::tuple_size<T>::value> {};
는 템플릿 인수 std::tuple_size<T>::value
에서 템플릿 매개 변수 T
을 사용하기 때문에 GCC는 컴파일되지 않습니다
error: template argument 'std::tuple_size<_Tp>::value' involves template parameter(s)
이제 tuple_size
템플릿 인수에 typename std::remove_reference<T>::type
와 T
을 교체하자
// Using primary structure template from previous example.
template<typename T>
struct S<T, std::tuple_size<typename std::remove_reference<T>::type>::value> {};
이 코드는 여전히 템플릿 인수에서 템플릿 매개 변수를 사용하지만 GCC는 오류나 경고없이이 매개 변수를 컴파일합니다. 왜?
non-type parameter of a partial specialization must be a simple identifier
이 이상한 제한은 무엇입니까 : 우리가 /std:c++latest
플래그 MSVS를 사용하여 두 번째 예제를 컴파일하려고하면
는 지금, 그것은 오류 C2755와 중지? I
이 튜플 크기와 같아지면 컴파일 시간 재귀를 멈추고 싶습니다.
MSVS 또는 GCC는 누구입니까? GCC는이 모든 인스턴스와 잘 작동하는 동안 MSVS이, 심지어 어떤 템플릿 인스턴스화하지 않고 오류를보고하는
참고 :
S<std::tuple<int, float>, 9> s1;
S<std::tuple<int, float>, 2> s2;
S<int, 42> s3;
내가 그것으로 MSVS 커뮤니티 2015 업데이트 3을 사용하여 기본 컴파일러와 GCC 6.2.1입니다.
Tried Clang 3.8.0. 그것은 GCC의 메시지와 유사한 오류가 두 조각을 컴파일되지 않습니다 :
error: non-type template argument depends on a template parameter of the partial specialization