2014-10-23 6 views
7

Was ist der Unterschied zwischen tun:Was ist der Unterschied zwischen "Freund Struct A;" und "Freund A;" Syntax?

struct A; 
struct B { friend struct A; }; 

und

struct A; 
struct B { friend A; }; 

Was bedeutet es, struct im zweiten Teil wegzulassen?

+0

rein gar nichts, da die Schnipsel Sie zur Verfügung gestellt haben. – Sneftel

+1

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

+0

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

Antwort

13

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:

  1. A ist ein typedef-name:

    class A; 
    typedef A A_Alias; 
    
    struct B { 
        // friend class A_Alias; - ill-formed 
        friend A_Alias; 
    }; 
    
  2. A ist ein Template-Parameter:

    template<typename A> 
    struct B { 
        // friend class A; - ill-formed 
        friend A; 
    }; 
    
+0

IIRC, in letzterem kannst du den vollständigen' friend typeName A' verwenden? – quetzalcoatl

+0

@quetzalcoatl nein, [du kannst nicht] (http://coliru.stacked-crooked.com/a/f080bdde9d602ac1), du verwechselst es wahrscheinlich mit [das] (http://coliru.stacked-crooked.com/a/818df2034d15bcf6) –

+0

@CaptainObvlious Danke, dass du darauf hingewiesen hast, ich habe die Antwort aktualisiert. –

Verwandte Themen