문제

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는 두 가지 다른 유형입니다. 템플릿 전문화로 논리를 확장하면, 파생 클래스의 내부 클래스를 통해 기본 클래스에서 선언 된 내부 클래스를 전문화하려고 할 때 실제로 동일한 이름 (그러나 다른 이름 지정 범위)으로 다른 유형을 정의하려고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top