회원 템플릿 전문화 및 그 범위
-
03-07-2019 - |
문제
C ++는 네임 스페이스 및 글로벌 범위 (MS VSC ++ 오류 C3412) 이외의 범위에서 멤버 템플릿 전문화를 허용하지 않는 것으로 보입니다. 그러나 나에게 파생 클래스가하는 일이기 때문에 기본 클래스의 기본 클래스의 1 차 멤버 템플릿을 전문화하는 것이 합리적입니다. 예를 들어 다음 예를 고려하십시오.
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.
}
내 질문은 왜 허용되지 않습니까?
해결책
나는 당신이하려는 일을 얻지 만, 당신은 그것을 제대로하지 않습니다. 이 시도 :
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;
};
다른 팁
내 질문은 왜 허용되지 않습니까?
내 초안 사본에서 다음은 위의 제한 사항을 제한하는 것으로 보입니다.
클래스 템플릿에 대한 명시 적 전문화 선언에서 클래스 템플릿 또는 클래스 멤버 템플릿의 구성원이 명시 적으로 전문화 된 클래스의 이름은 간단한 템플릿 ID입니다.
해결 방법은 동봉 클래스를 전문화하는 것입니다.
표준 사양을 "무시하고"논리적 인 논증을 시도합니다.
두 개의 수업이있는 경우 :
class A
{
struct S { };
};
class B: public A
{
struct S { };
};
A :: s와 b :: s는 두 가지 다른 유형입니다. 템플릿 전문화로 논리를 확장하면, 파생 클래스의 내부 클래스를 통해 기본 클래스에서 선언 된 내부 클래스를 전문화하려고 할 때 실제로 동일한 이름 (그러나 다른 이름 지정 범위)으로 다른 유형을 정의하려고합니다.
제휴하지 않습니다 StackOverflow