2010-12-28 7 views
20
struct Bar { 
    enum { Special = 4 }; 
}; 

template<class T, int K> struct Foo {}; 
template<class T> struct Foo<T,T::Special> {}; 

사용법 :구성원 열거 형을 사용하여 템플릿을 전문화 할 수 있습니까?

Foo<Bar> aa; 

그것은 푸의 부분 specilization에 대한 T::Special의 사용에 대한 불평 GCC 4.1.2 를 사용하여 컴파일하는 데 실패합니다. Special이 클래스 인 경우 솔루션은 앞에있는 typename에 대한 것입니다. 열거 형 (또는 정수)과 동일한 것이 있습니까?

+6

흥미로운 질문입니다. –

+0

T :: Special을 구체적인 정수 (99)라고 바꾸면 g ++ 4.4.0에서 '템플릿 인수의 개수가 잘못 (1, 2가되어야 함)'로 컴파일되지 않습니다. 별도의 문제는 아니지만 컴파일러가이를 받아 들여서는 안됩니까? – TonyK

답변

9

비 형식 템플릿 인수의 형식은 부분 전문화의 템플릿 매개 변수에 의존 할 수 없습니다.

는 ISO C++ 03 14.5.4/9

가 부분적 전문 비 형 인자 발현 인자 발현 간단한 식별자 인 경우를 제외하고 일부 전문 템플릿 파라미터를 포함하지 않는다 말한다. T::SpecialT

에 의존하기 때문에

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 

그래서 이런 걸는 사용도 불법 불법 template<class T> struct Foo<T,T::Special> {};이다. 하나의 템플릿 인수를 제공했지만 두 개를 제공해야합니다. 그 이후

+1

비 형식 템플릿 매개 변수의 형식이 부분 전문화의 템플릿 매개 변수에 따라 달라지는 이유는 무엇입니까? 타입은 여전히'int'입니다. –

+0

나는'T'에 의존하는 템플릿 인자 (템플릿 인자'int K'가 아니라)'T :: Special'에 대해서 말하고 있습니다. –

+0

아. 인자의 타입은'T'에 의존하고, 인자의 타입은'int'입니다. –

16

이 Prasoon에 의해 explained로 C++에 의해 허용되지 않습니다 그래서 대체 솔루션이 ideone에서 EnumToType 클래스 템플릿,

struct Bar { 
    enum { Special = 4 }; 
}; 

template<int e> 
struct EnumToType 
{ 
    static const int value = e; 
}; 

template<class T, class K> //note I changed from "int K" to "class K" 
struct Foo 
{}; 

template<class T> 
struct Foo<T, EnumToType<(int)T::Special> > 
{ 
    static const int enumValue = T::Special; 
}; 

샘플 코드를 사용하는 것입니다 : http://www.ideone.com/JPvZy


또는, 당신은 단순히 이렇게 전문화 할 수 있습니다 (문제가 해결된다면),

template<class T> struct Foo<T,Bar::Special> {}; 

//usage 
Foo<Bar, Bar::Special> f; 
+3

아주 좋은 솔루션! –

+1

실제로 좋은 해결책입니다. +1. :) –

+0

@James and Prasoon : 감사합니다 :-) – Nawaz

관련 문제