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.
}
내 질문에 허용되지 않는 이유는 무엇입니까?
현재, 유사한 코드를 잘못 받아 들인 g ++의 확인 된 버그 # 39906 (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39906)이 있습니다. 그러나 Comeau와 VC++는 그렇지 않습니다. – Sumant