Heim >Backend-Entwicklung >C++ >Warum benötige ich einen separaten Parameter für eine Friend-Vorlagenklasse innerhalb einer Klassenvorlage?

Warum benötige ich einen separaten Parameter für eine Friend-Vorlagenklasse innerhalb einer Klassenvorlage?

Barbara Streisand
Barbara StreisandOriginal
2024-11-17 18:40:02276Durchsuche

Why Do I Need a Separate Parameter for a Friend Template Class Inside a Class Template?

Klassenvorlage mit Vorlagenklassenfreund: Eintauchen in die Mechanik

Stellen Sie sich vor, Sie konstruieren eine Binärbaumklasse (BT) mit einer Elementklasse (BE). ) beschreibt jeden Knoten und ähnelt der folgenden Struktur:

template<class T> class BE {
    T *data;
    BE *l, *r;
public:
    template<class U> friend class BT;
};

template<class T> class BT {
    BE<T> *root;
public:
    ...
private:
    ...
};

Dieses Setup stößt auf eine merkwürdige Eigenart. Es wird versucht, den Freund als template zu deklarieren. Freundesklasse BT; schlägt fehl und erfordert die Verwendung eines separaten Parameters U (oder eines beliebigen Nicht-T-Parameters).

Diese Unterscheidung ergibt sich aus dem Konzept des Template-Shadowing. Vorlagenparameter können sich im Rahmen verschachtelter Vorlagen nicht gegenseitig duplizieren. Folglich sind unterschiedliche Parameternamen für verschachtelte Vorlagen unerlässlich.

Beachten Sie die folgenden Konstrukte:

template<typename T>
struct foo {
  template<typename U>
  friend class bar;
};

Hier wird bar unabhängig von seinen eigenen Vorlagenargumenten als Freund von foo deklariert. Alle Variationen von bar, ob bar, bar, bar oder andere, werden zu Freunden jeder Instanziierung von foo.

Im Gegensatz dazu die folgende Deklaration:

template<typename T>
struct foo {
  friend class bar<T>;
};

Impliziert, dass bar nur ein Freund von foo ist, wenn das Vorlagenargument von bar mit dem von foo übereinstimmt. Nur bar würde als Freund von foo betrachtet werden.

Daher kann in Ihrem speziellen Szenario die Form „friend class bar;“ übernommen werden. sollte effektiv die gewünschte Freundschaftsbeziehung zwischen BE und BT herstellen.

Das obige ist der detaillierte Inhalt vonWarum benötige ich einen separaten Parameter für eine Friend-Vorlagenklasse innerhalb einer Klassenvorlage?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn