Mein Verständnis war, dass eine friend
Erklärung auch als Forward-Deklaration für eine Klasse dienen könnte, wenn die class
Spezifizierer verwendet wurden, wie in diesem Beispiel:Freund Erklärung nicht vorwärts erklärt
class A
{
friend class B;
B* b;
};
class B {};
int main() {}
jedoch g ++ (4.6. 3 und 4.7.0) geben mir die folgenden Fehler (g ++ - 4.7 Unterstützung für extended friend declarations haben soll), die ohne eine Vorwärtsdeklaration erwartet wird:
main.cpp:6:2: error: ‘B’ does not name a type
In einem Versuch, meine Erwartungen zu bestätigen, dass die friend class B;
sollte als eine Vorwärtsdeklaration dienen, fand ich this answer und this answer, aber keine war schlüssig (oder ich konnte nicht viel von ihnen zumindest schließen), so versuchte ich, den C++ 11 Standard zu konsultieren und fand dieses Beispiel:
class X2 {
friend Ct; // OK: class C is a friend
friend D; // error: no type-name D in scope
friend class D; // OK: elaborated-type-specifier declares new class
}
Aufgrund meiner Lektüre der dritten Erklärung sollte mein friend class B
sein ein -Typ-Spezifizierer erarbeitet eine neue Klasse zu deklarieren.
Ich beginne gerade zu verstehen, offiziellen Standard Wortlaut, so dass ich etwas verpassen muss. Was verstehe ich falsch?
Nein, es ist wirklich ':: B': http : //ideone.com/bEgZrq. Beachten Sie "das innerste einschließende * non-class * scope". – aschepler
@ K-ballo Also wenn es heißt, eine neue Klasse deklariert, ist das nur für die Zwecke der Freundschaftsdeklaration, aber nicht für etwas anderes? – JaredC
@ JaredC: Das klingt ungefähr richtig für mich ... –