Pourquoi le C++ ami de classe ont besoin d'une déclaration anticipée que dans d'autres espaces de noms?

Supposons que j'ai une classe F que doit ê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, peu avant la déclaration de F est nécessaire.
  • de même, une classe A::BF peut être ami de 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;
}

Ce me semble incohérent. Est-il une raison à cela ou est-ce juste une décision de conception de la norme?

InformationsquelleAutor pesche | 2010-12-20