2013-06-16 4 views
5

나는 문제는 매개 변수가 모두 알려진 때 내부 템플릿을 전문으로하는 데 문제가 있습니다. 예를 들면 다음과 같습니다.전문 내부 템플릿

template < typename T0 > 
struct outer 
{ 
    template < typename T1 = void, typename T2 = void > 
    struct inner 
    { 
     typedef T1 type; 
    }; 
}; 
template < typename T0 > 
template < typename T1 > 
struct outer<T0>::inner<double,T1> { typedef int type; }; 

잘 작동합니다. 내가 대신과 같이 내부 템플릿을 지정하면, 그렇지 않습니다이 들어

template < typename T0 > 
template < > 
struct outer<T0>::inner<double,void> { typedef int type; }; 

나는 클래스 템플릿 명시 적으로 전문하지 둘러싸 ... '>'토큰 전에 오류 메시지 "잘못된 명시 적으로 전문화를 얻을 .. 부분 전문화에서 사용되지 않는 .template 매개 변수 : ... T0 ". WTAF가 여기에 있는지 확실하지 않습니다. 실패

template < typename T0 > 
struct outer<T0>::inner<double,void> { typedef int type; }; 

나는 이것을 예상하고 오류 메시지가 놀라운 일이 아니다 :

나는이 시도했다. 그것은 "너무 적은 템플릿 매개 변수 목록"입니다.

그래서,이 작업을 수행하는 올바른 방법은 무엇입니까? 나는 물론 그 주위를 해킹 할 수 있지만, 그렇게하지 않으면 나는 더 좋을 것이다. 허용되지 않습니다

+0

관련 : http://stackoverflow.com/questions/9219157/why-cant-i-specialize-the-nested-template - 구성원 -없는 - 전문 - 둘러싸는? LQ = 1 –

+0

흠 ... 제가 검색을 할 않았다하지만이 표시되지 않았다. 그렇게하기 전에 정확한 염소 종을 희생해서는 안됩니다. –

답변

7

. 완전히 전문화되지 않은 클래스 템플릿의 멤버를 완전히 전문화 할 수는 없습니다. 단락 당

는 C++ 11 표준의 14.7.16 :

클래스 템플릿의 멤버 또는 네임 스페이스 범위에 나타납니다 멤버 템플릿 멤버 템플릿에 대한 명시 적 전문화 선언에서

및 그 둘러싸는 클래스 템플릿의 일부는 포위 클래스 템플릿 명시 적으로뿐만 아니라 전문하지 않으면 선언이 명시 적으로 클래스 멤버 템플릿을 전문으로하지 않는다 것을 제외하고 특화되지 않은 , 을 남아있을 수 있습니다. [...]

또한, C++ 11 표준 조제 14.7.3/15 말한다

구성원 또는 구성원 템플릿 많은 둘러싸 클래스 템플릿 내에 중첩 될 수있다. 특정 회원에 대한 명시적인 전문화의 경우, 명시 적으로 전문화 된 클래스 템플릿을 둘러싸는 각 에 대해 회원 선언 앞에는 template<>이 와야합니다. [실시 예 :

template<class T1> class A { 
    template<class T2> class B { 
     void mf(); 
    }; 
}; 
template<> template<> class A<int>::B<double>; 
template<> template<> void A<char>::B<char>::mf(); 

-단부 예]

+0

그것은 멤버 함수가 아니지만 같은 규칙이 중첩 된 유형에 적용된다고 생각합니까? –

+0

Nate가 맞다고 가정합니다. 장/절을 인용 할 수 있습니까? 03은 더 좋지만 11 명이 할 것입니다. –

+1

@CrazyEddie : 예, 견적을 찾고 있어요 –