help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: g++ 4: Unrecognised Friendship [REPOST/CROSS-POST]


From: red floyd
Subject: Re: g++ 4: Unrecognised Friendship [REPOST/CROSS-POST]
Date: Thu, 04 Aug 2005 15:59:10 GMT
User-agent: Mozilla Thunderbird 1.0.6 (Windows/20050716)

JH Trauntvein wrote:
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.

I am reposting this with a cross-post to comp.lang.c++, because this is not just a compiler issue, but a language issue.

I believe that in this case, the friend declaration is in fact the first declaration of n1_base, and that therefore 7.3.1.2/3 applies.



reply via email to

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