Warum benötigt eine C ++ - Freundesklasse nur in anderen Namespaces eine Forward-Deklaration?

Angenommen ich habe eine Klasse F sollte sein Freund zu den Klassen G (global namespace) und C (im namespace A).

  • Freund zu A::CF muss nach vorn erklärt.
  • Freund zu G keine vorwärts-Deklaration von F notwendig ist.
  • ebenfalls eine Klasse A::BF können Freund zu A::C ohne forward-Deklaration

Der folgende code veranschaulicht diese und kompiliert mit GCC-4.5, VC++ 10 und zumindest mit einem anderen compiler.

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;
}

Dies erscheint mir inkonsistent. Gibt es einen Grund dafür oder ist es nur eine design-Entscheidung der standard?

InformationsquelleAutor der Frage pesche | 2010-12-20

Schreibe einen Kommentar