2011-04-22 3 views
2

다음 샘플 코드에는 어떤 문제가 있습니까? GCC에서는 컴파일되지 않습니다. 왜?C++ 템플릿의 중첩 이름 지정자를 도와 줄 사람이 있습니까?

template <class TA> 
struct A 
{ 
    template <class TAB> struct B; 
}; 

template <class TC> 
struct C {}; 


template <class TD> 
struct D 
{ 
    template <class TTD> class T {}; 
};  

template<class TA> 
template<class TBA> 
struct A<TA>::B : C<typename D<TA>::T<TBA> > 
{ 
    int foo; 
}; 

GCC 4.3.4 출력 : 템플릿 이름에 대한

error: template argument 1 is invalid 
error: expected `{' before ‘>’ token 
error: expected unqualified-id before ‘>’ token 
+0

문제를하시기 바랍니다 설명하기 위해 귀하의 질문에 제목을 수정합니다. –

+2

어떤 곳에서는'typename'이 누락 된 것 같습니다. 너무 집중해서 피곤했다. 나는 그것을 다른 누군가에게 남겨 둘 것이다. 하지만 질문의 일부분을 다시 말해야한다고 생각합니다. 누군가가 지금부터 1 년 후에 질문과 대답을 찾는다 고 상상해보십시오. 당신의 좌절감은 오래 가지 못할 것입니다. 단어는 머무른다. – 0xC0000022L

+1

좋은 질문 ... 그런 복잡한 유형의 템플릿을 보지 못했습니다! – iammilind

답변

6
struct A<TA>::B : C<typename D<TA>::template T<TBA> > 

명시 적으로 템플릿 인수에 의해 규정되는, 이름이 템플릿을 참조하는 것으로 알려져해야합니다.

회원 템플릿 전문화의 이름이 뒤에 표시되는 경우. postfix-expression 또는 qualified-id의 중첩 이름 지정자에서 ->를 사용하고 postfix-expression 또는 qualified-id가 템플릿 매개 변수 (14.6.2)에 명시 적으로 의존하면 구성원 템플릿 이름은 접두사는 키워드 템플릿입니다. 그렇지 않으면 이름이

T 템플릿 파라미터 TA에 따라 중첩 된 이름 지정자 D<TA> 후 나타나는 비 템플릿을 이름을 가정한다. 구문 D<TA>::T<TBA>은 클래스 템플릿의 이름으로 T을 해석해야하므로 template 키워드는 해당 시점에서 표준에서 요구합니다.

관련 문제