2009-04-30 3 views
4

C++은 네임 스페이스 및 전역 범위 (MS VSC++ 오류 C3412) 이외의 다른 모든 범위에서 멤버 템플릿 전문화를 허용하지 않습니다. 하지만 기본 클래스의 기본 멤버 템플릿을 파생 클래스에서 특수화하는 것은 이치에 맞습니다. 파생 클래스가 수행하는 것이기 때문입니다. 기본 클래스의 것들을 전문화하기 때문입니다. 예를 들어, 다음 예제를 고려하십시오.구성원 템플릿 전문화 및 해당 범위

struct Base 
{ 
    template <class T> 
    struct Kind 
    { 
     typedef T type; 
    }; 
}; 

struct Derived : public Base 
{ 
    /* Not Allowed */ 
    using Base::Kind; 
    template <> 
    struct Kind <float> 
    { 
    typedef double type; 
    }; 
}; 

int main(void) 
{ 
    Base::Kind<float>::type f; // float type desired 
    Derived::Kind<float>::type i; // double type desired but does not work. 
} 

내 질문에 허용되지 않는 이유는 무엇입니까?

+1

현재, 유사한 코드를 잘못 받아 들인 g ++의 확인 된 버그 # 39906 (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39906)이 있습니다. 그러나 Comeau와 VC++는 그렇지 않습니다. – Sumant

답변

4

나는 당신이하려고하는 것을 얻지 만, 당신은 올바르게하지 못하고있다. 이 시도 : 당신이 두 개의 클래스가있는 경우

:

struct Base{}; 
struct Derived{}; 

// Original definition of Kind 
// Will yield an error if Kind is not used properly 
template<typename WhatToDo, typename T> 
struct Kind 
{ 
}; 

// definition of Kind for Base selector 
template<typename T> 
struct Kind<Base, T> 
{ 
    typedef T type; 
}; 

// Here is the inheritance you wanted 
template<typename T> 
struct Kind<Derived, T> : Kind<Base, T> 
{ 
}; 

// ... and the specialization for float 
template<> 
struct Kind<Derived, float> 
{ 
    typedef double type; 
}; 
1

내 질문에 허용되지 않는 이유는 무엇입니까? 초안의 내 사본에서

다음은 위의 제한을두고 나타납니다 : 클래스 템플릿 에서 클래스 템플릿의 멤버 또는 클래스 멤버를 명시 적 전문화 선언을

을 템플릿에서 명시 적으로 특수화 된 클래스의 이름은 simple-template-id 여야합니다.

해결 방법은 둘러싸는 클래스를 전문화하는 것입니다.

1

내가 논리적 인수를 표준 사양을 "무시"를 시도 할 것이다

class A 
{ 
    struct S { }; 

}; 

class B: public A 
{ 
    struct S { }; 
}; 

:: S와 B를 :: S를 두 가지 유형이 있습니다. 논리를 템플릿 특수화로 확장하면 파생 클래스의 내부 클래스를 통해 기본 클래스에 선언 된 내부 클래스를 특수화하려고 할 때 실제로 동일한 이름 (다른 명명 범위)으로 다른 유형을 정의하려고합니다.

관련 문제