2014-10-23 11 views
7

Qual è la differenza tra fare:Qual è la differenza tra "friend struct A;" e "amico A;" sintassi?

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

e

struct A; 
struct B { friend A; }; 

Che cosa significa lasciare fuori struct nella seconda parte?

+0

Niente di niente, dati i frammenti che avete fornito. – Sneftel

+1

Per quanto riguarda il secondo snippet di codice, volevo dire "#define A void foobar (int, double)", ma la precedente dichiarazione forward di 'struct A;" invalida quel (mezzo) joke. Eh. – quetzalcoatl

+0

Nel caso in cui non siate d'accordo con la modifica del titolo che ho proposto, sentitevi liberi di reedit. Ho solo pensato che il titolo originale suonava più simile a un forum teen peer-support: | Forse sono solo io oggi .. – quetzalcoatl

risposta

13

La differenza è che se si scrive friend A;, A deve essere un nome di tipo noto, ovvero deve essere dichiarato in precedenza.

Se si scrive friend struct A;, questo è di per sé una dichiarazione di A, quindi non sono necessari dichiarazione preventiva:

struct B { friend struct A; }; // OK 

Ci sono diverse sottigliezze però. Ad esempio, friend class/struct A dichiara classe A nel più intimo spazio dei nomi che racchiude di classe B (grazie a 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 
    }; 
} 

ci sono anche molti altri casi in cui si può scrivere solo friend A:

  1. A è un typedef-name:

    class A; 
    typedef A A_Alias; 
    
    struct B { 
        // friend class A_Alias; - ill-formed 
        friend A_Alias; 
    }; 
    
  2. A è un parametro di modello:

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

IIRC, in quest'ultimo puoi usare full' friend typename A'? – quetzalcoatl

+0

@quetzalcoatl no, [non puoi] (http://coliru.stacked-crooked.com/a/f080bdde9d602ac1), probabilmente lo stai confondendo con [questo] (http://coliru.stacked-crooked.com/a/818df2034d15bcf6) –

+0

@CaptainObvlious Grazie per averlo indicato, ho aggiornato la risposta. –

Problemi correlati