Supposons que j'ai une classe F
qui devrait être un ami pour les classes G
(dans l'espace de noms global) et C
(dans l'espace de noms A
).
- pour être ami de
A::C
,F
doit être déclaré avant. - pour être ami de
G
, pas de déclaration anticipée d'F
est nécessaire. - de même, une classe
A::BF
peut être l'ami d'A::C
sans déclaration anticipée
Le code suivant illustre et compile avec GCC 4.5, VC++ 10 et au moins avec un autre compilateur.
class G {
friend class F;
int g;
};
// without this forward declaration, F can't be friend to A::C
class F;
namespace A {
class C {
friend class ::F;
friend class BF;
int c;
};
class BF {
public:
BF() { c.c = 2; }
private:
C c;
};
} // namespace A
class F {
public:
F() { g.g = 3; c.c = 2; }
private:
G g;
A::C c;
};
int main()
{
F f;
}
Cela me semble incohérent. Est-il une raison à cela ou est-ce juste une décision de conception de la norme?