Frage

Ich habe versucht, drei Iterationen des folgenden einfachen Programm. Dies ist ein stark vereinfachte Versuch, ein Behälter-und-Iterator Paar von Klassen zu schreiben, aber ich lief in Probleme mit unvollständigen Typen (forward-Deklarationen). Ich entdecken, dass dies tatsächlich möglich ist, wenn ich alles templatized - aber nur, wenn ich die Template-Parameter tatsächlich verwendet! (Ich erkannte dies an der

Andere Tipps

Sie können dies durch, ohne Vorlagen tun definieren iter :: iter () nach Definition des Behältnisses:

struct container;

struct iter {
  container &c;
  int *p;
  iter(container &c);
};

struct container {
  int x;
  int &value() { return x; }
  iter begin() { return iter(*this); }
};

iter::iter(container &c)
    : c(c), p(&c.value()) {}

int main() {
  container c;
  c.begin();
  return 0;
}

Template-Version funktioniert, weil, wenn Sie Vorlagen beiden Klassen instanziiert werden vollständig definiert ist.

Im ersten Fall, Sie versuchen, eine Memberfunktion der Container-Klasse zuzugreifen, bevor die Klasse definiert wurde, so wird dies nicht funktionieren.

Im zweiten Fall wird die Vorlage zum ersten Mal instanziiert es mit einem bestimmten Typ verwendet wird. An diesem Punkt hat sich die Container-Klasse definiert wurde, in Haupt- und so kompiliert.

Im dritten Fall gibt es eine zirkuläre Referenz. Container verwendet iter und iter verwendet Behälter, so kann es nicht funktionieren.

scroll top