2013-02-10 7 views
4

클래스 외부의 템플릿 매개 변수에 액세스하고 싶습니다. 보통 다음과 같이합니다 :타입이 아닌 템플릿 매개 변수 typedefy

template <class T> 
class A 
{ 
    typedef typename T T; 
} 

A<int>::T; 

비 형식 템플릿 매개 변수에 대해 동일한 작업을 수행하고 싶습니다. 작동하지 않습니다 :

template <int T> 
class A 
{ 
    typedef typename T T; 
} 

A<3>::T; 

나는 이것을 왜 필요하게하는지 명확히 할 것입니다. 다음과 같이 두 번째 클래스를 정의하려고합니다.

template <class C> 
class B 
{ 
    static int func() {return C::T;} 
} 

B<A<3> >::func(); 

올바른 방법은 무엇입니까? 대단히 감사합니다.

+1

'class'는'typename'과 호환되며'int'는 아닙니다. 또한 달성하려는 것은 무엇입니까? – antonijn

+0

실제로'T'가 종속 이름이 아니기 때문에'Tename'을 다시 정의 할 수 없으므로 두 코드 모두'typename'을 사용할 수 없습니다. 종속되지 않은 이름'T'와 같이 규정되지 않은 이름 앞에'typename'을 사용하면 –

+0

을 사용할 수 없습니다. –

답변

5

T은 유형 이름이 아니기 때문에 typedef 수 없습니다. int 값이며 클래스의 정적 멤버로 액세스하려는 경우 정적 멤버 int이 필요합니다. 그래서 아마도,

template <int T> 
class A 
{ 
    public: 
    static const int x = T; 
}; 

doSomething(A<5>::x); 
2

그것은 값, 그리고 타입입니다 :

template <int T> 
class A 
{ 
    static const int param = T; 
}; 

을 그리고 당신은 A<42>::param로 액세스 할 수있는 당신이 정말로 원하는 것은이처럼 보인다. A가 그 자체가 다른 곳의 템플릿 매개 변수로 사용되지 않는 한별로 도움이되지 않습니다.

1

두 번째 경우는 T이 아니며, int 값입니다. 따라서 const int 또는static const int 값으로 정의해야합니다. 이 (템플릿이 모나드 경우에는 종류에 모호함이 없기 때문에, 특히) 상수, 그리고 다른 이름은 일반적으로 더 의미있는 이름 예를 들어, 유형 T를 사용하는 것이 관례입니다

template <int T> 
class A { 
    static const int T = T; 
}; 

SIZE 또는 바람직하게는 Size (모든 대문자 기호는 매크로에 가장 잘 사용됩니다).

template <int Param> 
class A { 
    static const int param = Param; 
}; 

템플릿 정의의 맥락에서 static const 값의 사용에 대한 다른 SO 질문 (같은 this one)를 참조하십시오.

관련 문제