2013-10-07 4 views
1

유형 별칭 및 중첩 클래스/범위를 사용하는 경우 이상한 문제가 발생했습니다. GCC와중첩 클래스에서 유형 별칭 사용

template<typename T> 
struct container 
{ 
}; 

struct Outer 
{ 
    using type_t = int; 
    struct Inner 
    { 
     using container_t = container<type_t>; 
     using type_t = Outer::type_t; //error in MinGW 
    }; 
}; 

생성 된 오류 : 다음 코드는 행복하게 nuwen는 MinGW 4.8.1에서 3.3 그 소리에 의해 허용하지만, 거부 http://ideone.com/cba6Fp가 (내 시스템에 오류 일치)

에 오류를 해결하려면 MinGW, 당신은 단순히 container_t의 정의를 type_t 이후로 옮깁니다. (이것이 의미가 있습니다. 그리고 원래해야만했던 것입니다.) - 그러나 제 질문은 왜 이것이 MinGW가 아닌 clang으로 컴파일합니까? 코드가 유효하거나 유효하지 않습니까?

답변

2

문제가되어 3.3.7/1 basic.scope.class]

2) N 이름 컨텍스트에 동일한 참조 선언한다 S 클래스에 재 사용될 때 이 규칙을 위반할 경우 진단은 필요하지 않습니다.

당신은 Inner에 이름 type_t를 사용하지만, Inner::type_t의 선언 전에. 그래서 그 이름은 규칙을 어기는 두 가지 다른 선언을 의미합니다.

진단이 필요하지 않으므로 clang은 기술적으로 부적합하지 않지만 여기서는 오류가 발생합니다.

+0

나는 어떤 위반이 진단을 필요로하지 않는다는 것을 알지 못했습니다. 얼마나 많은 다른 '숨겨진 오류'가 이처럼 있습니까? –

+0

@ LB-- 초안 표준에서 "진단이 필요하지 않습니다"라는 단어가 23 번 나타납니다. – TemplateRex