[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: g++ 4: Unrecognised Friendship
From: |
JH Trauntvein |
Subject: |
Re: g++ 4: Unrecognised Friendship |
Date: |
4 Aug 2005 05:29:32 -0700 |
User-agent: |
G2/0.2 |
red floyd wrote:
> JH Trauntvein wrote:
> > Consider the following example:
> >
> > namespace n1
> > {
> > class cn1_base;
> >
> >
> > namespace n1_helpers
> > {
> > class helper1
> > {
> > private:
> > int private_member;
> > friend class cn1_base;
> > };
> > };
> >
> >
> > class cn1_base
> > {
> > public:
> > void foo()
> > {
> > n1_helpers::helper1 helper;
> > helper.private_member = 1;
> > }
> > };
> > };
> >
> >
> > While this compiled with earlier versions of G++, G++ version 4.x fails
> > to compile this and gives the following message:
> >
> > 'int n1::n1_helpers::helper1::private_member' is prviate within this
> > context
> >
> > Fortunately, I can work around this by changing the friend declaration
> > to the following:
> >
> > friend class n1::n1_base;
> >
> > Is this a bug in the compiler or have I misunderstood something about
> > friendship declarations?
>
> See Standard paragrah 7.3.1.2, subparagraph 3. "If a friend declaration
> in a non-local class first declares a class or function, the friend
> class or function is a member of the innermost enclosing namespace."
>
> Sounds to me like it was a bug in earlier g++ versions.
It seems to me that the key here is in the phrase, "first declares a
class or function". The sample code that I provided had a forward
declaration of the class in the appropriate namespace that the
friendship declaration should have used.
Regards,
Jon Trauntvein