Der Unterschied ist, dass, wenn Sie friend A;
schreiben, A
muss ein bekannter Typ Name sein, das heißt, es muss zuvor deklariert werden.
Wenn Sie friend struct A;
schreiben, dies selbst ist eine Erklärung von A
, so dass keine vorherige Anmeldung ist erforderlich:
struct B { friend struct A; }; // OK
Es gibt allerdings einige Feinheiten. Zum Beispiel erklärt friend class/struct A
Klasse A
in innersten umschließenden Namensraum der Klasse B
(dank Captain Obvlious):
class A;
namespace N {
class B {
friend A; // ::A is a friend
friend class A; // Declares class N::A despite prior declaration of ::A,
// so ::A is not a friend if previous line is commented
};
}
Auch gibt es einige andere Fälle, in denen Sie friend A
schreiben können nur:
A
ist ein typedef-name:
class A;
typedef A A_Alias;
struct B {
// friend class A_Alias; - ill-formed
friend A_Alias;
};
A
ist ein Template-Parameter:
template<typename A>
struct B {
// friend class A; - ill-formed
friend A;
};
rein gar nichts, da die Schnipsel Sie zur Verfügung gestellt haben. – Sneftel
Was das zweite Code-Snippet betrifft, wollte ich '#define A void foobar (int, double)' sagen, aber die vorhergehende Vorwärts-Deklaration von 'struct A;' macht diesen (halben) Witz ungültig. Eh. – quetzalcoatl
Wenn Sie nicht einverstanden sind mit der Titeländerung, die ich vorgeschlagen habe, zögern Sie nicht umzuschreiben. Ich dachte nur, dass der ursprüngliche Titel mehr wie .. jugendlich Peer-Support-Forum klang: | Vielleicht ist das nur ich heute .. – quetzalcoatl