Frage

Es scheint mir, dass C ++ nicht Mitglied Template-Spezialisierung in jedem Bereich anders als Namensraum und die globale Reichweite (MS VSC ++ Fehler C3412) erlaubt. Aber ich macht es Sinn, eine Basisklasse der primäre Mitglieds-Vorlage in der abgeleiteten Klasse zu spezialisieren, weil das ist, was abgeleiteten Klassen tun - spezialisiert Dinge in der Basisklasse. Betrachten wir zum Beispiel das folgende Beispiel:

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

Meine Frage ist, warum ist es nicht erlaubt?

War es hilfreich?

Lösung

ich bekommen, was Sie zu tun versuchen, aber sie tun es nicht richtig. Versuchen Sie folgendes:

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

Andere Tipps

  

Meine Frage ist, warum ist es nicht erlaubt?

Aus meiner Kopie des Entwurfs es scheint, dass die Einhaltung der obigen Beschränkung setzt:

  

  eine explizite Spezialisierung Deklaration für eine Klasse-Vorlage, ein Mitglied einer Klasse-Vorlage oder ein Klassenmitglied   Vorlage, der Name der Klasse, die explizit spezialisiert ist ein einfacher-template-ID.

Die Abhilfe ist die einschließenden Klasse zu spezialisieren.

Ich werde "ignorieren", um die Standard-Spezifikationen und versuche, ein logisches Argument:

Wenn Sie zwei Klassen:

class A
{
   struct S { };

};

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

A :: S und B :: S sind zwei verschiedene Typen. Erweitern der Logik auf die Vorlage Spezialisierungen, wenn Sie versuchen, eine innere Klasse in der Basisklasse durch eine innere Klasse in abgeleiteten Klasse deklariert zu spezialisieren, Sie versuchen, tatsächlich eine andere Art zu definieren, mit dem gleichen Namen (aber eine andere Benennung scope).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top