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.
_______________________________________________
Help-gplusplus mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/help-gplusplus