سؤال

ويبدو لي أن 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.
}

وسؤالي هو لماذا لا سمح؟

هل كانت مفيدة؟

المحلول

وأحصل على ما نحاول القيام به، ولكن لا يفعلون ذلك الحق. جرب هذا:

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;
};

نصائح أخرى

<اقتباس فقرة>   

وسؤالي هو لماذا لا سمح؟

ومن نسختي مشروع يبدو أن يلي يضع قيود أعلاه:

<اقتباس فقرة>   

في   إعلانا التخصص صريحة لقالب فئة، وهو عضو في قالب فئة أو عضو الفئة   القالب، يجب أن يكون اسم الفئة التي يتم المتخصصة صراحة بسيط قالب معرف.

والحل هو متخصصون الطبقة إرفاق.

وسوف "تجاهل" للمواصفات القياسية ومحاولة حجة منطقية:

إذا كان لديك فئتين:

class A
{
   struct S { };

};

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

وA :: S و B :: S هي نوعين مختلفين. تمديد منطق التخصصات القالب، عند محاولة متخصصون فئة الداخلية أعلنت في الفئة الأساسية من خلال الطبقة الداخلية في فئة مشتقة، كنت في الواقع تحاول تحديد نوع مختلف، بنفس الاسم (ولكن نطاق تسمية أخرى).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top