2011-02-02 2 views
0
template <typename T> 
struct A 
    { 
    template <typename U> 
    struct B; 

    template <> 
    struct B<int> {static const int tag = 1;}; // Works fine in VS2010 
    }; 

어떻게 같은 방법으로 B를 전문으로 할 수 있지만, A. 외부 I없이 성공이 시도 : 내가 얻을전문화

template <typename T> template <> 
struct A<T>::B<int> {static const int tag = 1;}; 

:

error C3212: 'A<T>::B<int>' : an explicit specialization of a template member must be a member of an explicit specialization

그것은 클래스의 내부를 정의하여 내가 정확히 할 수 있기 때문에 이해가되지 않습니다

VS2010 문제가 있습니까? 잘못된 구문입니까?

감사


PS :이 하나 (어쨌든 잘못한다, 충돌 VS2010) :

template <> template <typename T> 
struct A<T>::B<int> {static const int tag = 1;}; 

답변

2

는 C를 인용 ++ 사양, § 14.17.3.18 :

클래스 템플릿의 멤버에 대한 명시 적 전문화 선언 또는 namespace 범위에 나타나는 멤버 템플릿, 멤버 템플릿 및 일부 포함 클래스 템플릿은 구체화되지 않은 채로 남아있을 수 있습니다 (). 단, 포함 된 클래스 템플릿이 명시 적으로에도 적합하지 않은 경우 클래스 멤버 템플릿을 명시 적으로 특수화해서는 안됩니다. [...]

(내 강조)

이 외부 템플릿 클래스뿐만 아니라 전문 경우를 제외하고는 다른 템플릿 클래스 내에 중첩 된 템플릿 클래스를 전문으로 할 수 있음을 시사한다. 그래서 VS2010이 잘못된 동작을 보이고 g ++이 올바르게 작동합니다. 그냥 그런 식으로 작동하지 않습니다

+0

감사합니다. 왜 예외인가? 개념적으로 허용하는 것이 허용 가능할 것입니다. – Frigg

+0

@ Frigg- 만약 내가 추측해야한다면 내부 템플리트를 사용하여 외부 특수화를 수행하는 것과 내부 특성화 된 외부 템플릿이지만, 나는 전혀 모른다. 나는 당신이 질문을 게시 할 때까지 이것이 불법이라는 것을 몰랐습니다. :-) – templatetypedef

+0

내 마음에, 이것은 매우 모호하지 않습니다. 나는 그들을 위해 예외를 추가하는 것을 상상하는 것이 힘들다. 어떤 예외도 문제를 일으키고, (당신이 나에게 묻는다면)이 경우가 아닌 것보다 더 많은 모호함이 있습니다. :( – Frigg

1

. :-(

당신은 MSVC는 기본 설정이 허용 되는 경우가있을 수 있지만, 클래스 선언 내에서 함수를 전문으로 할 수

.

당신은 또한 멤버를 전문으로 할 수 (언어 표준처럼)

관련 문제