help-gplusplus
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]