Ich habe drei Iterationen des folgenden einfachen Programms ausprobiert. Dies ist ein sehr vereinfachter Versuch, ein Container-und-Iterator-Klassenpaar zu schreiben, aber ich stieß auf Probleme mit unvollständigen Typen (Forward-Deklarationen). Ich entdeckte, dass dies tatsächlich möglich war, nachdem ich alles templatiert hatte - aber nur, wenn ich tatsächlich den Template-Parameter verwendete! (Ich erkannte dies durch Blick auf die Google sparsetable code.)Warum lassen sich mit C++ - Vorlagen unvollständige Typen umgehen (Forward-Deklarationen)?
Alle Hinweise, warum die zweite funktioniert, während die dritte nicht funktioniert? (Ich weiß, warum der erste nicht funktioniert - der Compiler muss das Speicherlayout des Containers kennen.)
Vielen Dank im Voraus.
// This doesn't work: invalid use of incomplete type.
#if 0
struct container;
struct iter {
container &c;
int *p;
iter(container &c) : c(c), p(&c.value()) {}
};
struct container {
int x;
int &value() { return x; }
iter begin() { return iter(*this); }
};
int main() {
container c;
c.begin();
return 0;
}
#endif
// This *does* work.
template<typename T> struct container;
template<typename T> struct iter {
container<T> &c;
T *p;
iter(container<T> &c) : c(c), p(&c.value()) {}
};
template<typename T> struct container {
T x;
T &value() { return x; }
iter<T> begin() { return iter<T>(*this); }
};
int main() {
container<int> c;
c.begin();
return 0;
};
// This doesn't work either.
#if 0
template<typename T> struct container;
template<typename T> struct iter {
container<int> &c;
int *p;
iter(container<int> &c) : c(c), p(&c.value()) {}
};
template<typename T> struct container {
int x;
int &value() { return x; }
iter<int> begin() { return iter<int>(*this); }
};
int main() {
container<int> c;
c.begin();
return 0;
}
#endif
Könnten Sie genauer sein, was "nicht funktioniert" eigentlich bedeutet? Kann es nicht kompiliert werden, und wenn ja, was ist die Nachricht? Läuft es nicht richtig, und wenn ja, was macht es, von dem Sie das nicht erwartet haben? –
Es kann nicht kompiliert werden, mit der Nachricht, die ich angegeben habe: "ungültige Verwendung von unvollständigem Typ." – Yang