Betrachten Sie den Code unten:Warum ist eine Inline-Deklaration kein unvollständiger Typ?
struct Foo {
struct Bar;
Foo()
{
Bar bar; // Why isn't Bar an incomplete type?!
}
struct Bar {}; // Full definition
};
// struct Bar {}; // fails to compile due to incomplete type
int main()
{
Foo foo;
}
unter mindestens 2 Compiler kompiliert fein (gcc5.2, clang3.5). Meine Frage ist:
- Warum ist nicht
Bar
ein unvollständiger Typ im KonstruktorFoo::Foo
betrachtet, wie ich es über den Konstruktor voraus erklären, aber es vollständig in den Konstruktor verwenden?
Immer, wenn ich Foo::Bar
außerhalb der Klasse bewegen, mit anderen Worten Bar
wird ein Stand-alone-Klasse, bekomme ich die erwartete
error: aggregate 'Foo::Bar bar' has incomplete type and cannot be defined
Mitgliederfunktionskörper verhalten sich so, als wären sie außerhalb der Linie definiert (d. H. Nach der Klassendefinition). –
Der Hauptgrund ist, dass der Compiler alle Definitionen innerhalb der Klasse lokal durchsuchen kann, wenn er festlegt, wie er mit jedem Typ umgehen soll. Der Umfang wird vollständig untersucht, da es nur ein kleiner Teil Ihres Programms ist und nicht auf die Reihenfolge der Deklarationen im Quellcode angewiesen ist. – tp1