2
template < int ...Indices> 

class T1 { 
    template <int _1, int _2> 
    class T2; 
}; 

template <int ...Indices> 
template <int _1> 
class T1<Indices...>::T2<_1, sizeof...(Indices)> {}; 
//^--error: non-type template argument depends on a template parameter of the partial specialization 

은 gcc 4.5 이상에서 컴파일되지만 clang 3.1 및 icc에서는 모두 sizeof...(Indices)의 사용법에 대해 불평하지 않습니다. 후자의 컴파일러 또는 일부 특수한 경우에 아직 구현되지 않은 기능입니까?둘러싸인 템플릿 매개 변수에 따라 중첩 된 템플릿 전문화

감사합니다,

Buote

+4

해당 컴파일러의 버그처럼 보입니다. 가능한 경우,'T1'의'class {}'블록 안에 중첩 된 템플릿을 정의 해보십시오. 필요할 경우 별도의 멤버 템플릿을 위임 할 수도 있습니다. – Potatoswatter

답변

0

당신이하려고 시도 할 수 있습니다 :

template < int ...Indices> 
class T1 
{ 
    static const int index_size = sizeof...(Indices); 

    template <int _1, int _2> 
    class T2; 
}; 

template <int ...Indices> 
template <int _1> 
class T1<Indices...>::T2<_1, T1<Indices...>::index_size> {}; 

를 컴파일러 문제가 실제 sizeof... 연산자 있는지, 또는이 방식에 있다면이 사용되고 템플릿 선언에. - 부분적으로 전문화 된 비 타입 인수
:

+0

그 중 하나가 작동하지 않습니다, 그래서 그들은 둘 다 순간에 기능이 부족한 것 같아요 - 해결 방안으로 난 그냥 부분 전문화 상수 값 (예 : 1) 할 수 있도록 내 초기 재귀 순서를 바꿨습니다. –

+0

intel 컴파일러는 중첩 클래스의 특수화와 관련하여 때로는 이상한 문제가 있습니다. 외부 선언 대신 외부 클래스의 '{}; 블록 내부에서 해당 선언이 필요합니다. –

1

이 표준은 클래스 템플릿 부분 특수화의 인수 목록 내에서

는, 다음과 같은 제한이 적용하는 것이 제 8 temp.class.spec] 말한다 표현식은 인수 표현식이 단순한 식별자 인 경우를 제외하고는 부분 전문화의 템플릿 매개 변수를 포함하지 않아야합니다. [예 :

 
    template <int I, int J> struct A {}; 
    template <int I> struct A<I+5, I*2> {}; // error
template <int I, int J> struct B {}; template <int I> struct B<I, I> {}; // OK
- 단부 예]

규칙의 목적은 실시 예에서와 같은 비 단순 식에 기초하여 부분 전문을 허용하는

sizeof...(Indices) 정도로 하지 간단한 식별자 어쩌면 clang과 ICC가이를 거부 할 수도 있습니다. 나는 어떤 컴파일러가 옳은 것인지 정직하지 못하다. 나는 컴파일러 중 하나에게 버그를보고하고 그들의 구현이 올바르다 고 말하면 다른 방법으로 그것을 해석하기 위해 다른 사람들에게보고한다.