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

_______________________________________________
Help-gplusplus mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/help-gplusplus

Reply via email to