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
:
A
è un typedef-name:
class A;
typedef A A_Alias;
struct B {
// friend class A_Alias; - ill-formed
friend A_Alias;
};
A
è un parametro di modello:
template<typename A>
struct B {
// friend class A; - ill-formed
friend A;
};
fonte
2014-10-23 22:17:20
Niente di niente, dati i frammenti che avete fornito. – Sneftel
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
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