Date: Thu, 17 Oct 1996 22:54:07 -0600 (MDT) From: Nate Williams <nate@mt.sri.com> To: hackers@freebsd.org Cc: Nate Williams <nate@mt.sri.com>, mrs@sygnus.com Subject: Re: C++ question Message-ID: <199610180454.WAA22620@rocky.mt.sri.com> In-Reply-To: <3266CD1E.41C67EA6@fsl.noaa.gov> References: <199610172119.PAA20617@rocky.mt.sri.com> <3266AE63.41C67EA6@fsl.noaa.gov> <199610172209.QAA21050@rocky.mt.sri.com> <3266CD1E.41C67EA6@fsl.noaa.gov>
next in thread | previous in thread | raw e-mail | index | archive | help
class foo { private: struct A { int myint; } struct B { A *ptr; // Disallowed in the C++ standard } }; > [ Sun's ] compiler notes explicitly (well, not so explicitly) say > that newer C++ standards don't allow this. Mike Stump (who is the C++ standards guru for Cygnus) responded with the following: Sun's compiler is correct. To access it, you must say it is a friend: 11.8 Nested classes [class.access.nest] 1 The members of a nested class have no special access to members of an enclosing class, nor to classes or functions that have granted friend- ship to an enclosing class; the usual access rules (_class.access_) shall be obeyed. The members of an enclosing class have no special access to members of a nested class; the usual access rules (_class.access_) shall be obeyed. [Example: class E { int x; class B { }; class I { B b; // error: E::B is private int y; void f(E* p, int i) { p->x = i; // error: E::x is private } }; int g(I* p) { return p->y; // error: I::y is private } }; --end example] So, in order to be fully conforming the code could be written as follows: class foo { private: struct A { int myint; } // The C++ standard requires the friend stuff struct B; friend struct B; struct B { A *ptr; // Disallowed in the C++ standard } }; Thanks to all, especially Mike who provided both the validation of the Sun compiler and the solution. Nate
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199610180454.WAA22620>