Ich verstehe anscheinend, wie das C-ish-Feature der gleichzeitig "deklariert" und verweist auf einen Typ struct X
funktioniert in C++. (Ich weiß nicht einmal, wie diese Funktion richtig heißt.) Ich habe drei Beispiele unten, um zu zeigen, was ich tue, aber die Hauptfrage lautet: Warum ist der verschachtelte Typ, der auf diese Weise vorwärts deklariert wird, global gültig? statt im Klassenraum?Verwendung von "struct Foo" im Feld decl leitet nicht weiter deklarieren geschachtelte Klasse
This arbeitet eine verschachtelte Struktur weiterleiten erklären:
#include <memory>
class Foo1
{
Foo1();
~Foo1();
struct Impl;
std::auto_ptr<Impl> m_pimpl;
};
struct Foo1::Impl
{
Impl(){}
~Impl(){}
};
Foo1::Foo1(){}
Foo1::~Foo1(){}
int main() {}
So nun möchte ich unter Verwendung eines Halb erinnerte C-Funktion, ein paar Zeichen speichern so see, wo ich für die abgenommene habe die Linie struct Impl;
und Feld erklärte seine Art als auto_ptr<struct Impl>
statt auto_ptr<Impl>
:
#include <memory>
class Foo2a
{
Foo2a();
~Foo2a();
std::auto_ptr<struct Impl> m_pimpl;
};
struct Foo2a::Impl
{
Impl(){}
~Impl(){}
};
Foo2a::Foo2a(){}
Foo2a::~Foo2a(){}
int main() {}
Hier ist der Compiler, dass no struct named 'Impl' in 'Foo2a'
beschwert. Sicher genug, ist es im globalen Bereich, wie this kompiliert:
#include <memory>
class Foo2b
{
Foo2b();
~Foo2b();
std::auto_ptr<struct Impl> m_pimpl;
};
struct Impl
{
Impl(){}
~Impl(){}
};
Foo2b::Foo2b(){}
Foo2b::~Foo2b(){}
int main() {}
Was ist da los? a) Warum funktioniert es überhaupt, den Typ Impl
auf diese Weise zu "deklarieren", und b) vorausgesetzt, dass es funktioniert, warum ist Impl
im globalen Bereich nicht Klassenbereich?
Und, BTW, das Feld als auto_ptr<struct Foo2c::Impl>
doesn't work either deklarieren.
FYI: auto_ptr ist veraltet und wird wahrscheinlich bald aus der Sprache entfernt. Ziehen Sie stattdessen "std :: unique_ptr" oder "std :: shared_ptr" in Betracht. – kfsone
@ kfsone - Danke, es ist nur ein Beispiel, ersetze 'std :: shared_ptr' oder' std :: optional' wenn du willst. – davidbak
Die kurze Antwort lautet "weil C++ so funktioniert". –