class private_object
{
private:
struct make_public;
friend struct make_public;
static void method1() {}
};
struct private_object::make_public
{
class nested_outer
{
void callFromOuter()
{ private_object::method1(); } // Should this be an error?
class nested_inner
{
void callFromInner()
{ private_object::method1(); } // How about this one?
};
};
};
Ten problem z przyjaźnią pojawił się, kiedy próbowałem przesłać projekt open source do kompilacji pod borlandem. Zgodnie z parashift i dwoma częściowo związanymi pytaniami here i here powyższy przykład nie powinien być prawidłowy.Czy znajomi powinni być przechodni w klasach zagnieżdżonych?
Jednak po przetestowaniu go na siedem różnych kompilatorów tylko Borland i DMC skarżył. To zachowanie zaskoczyło mnie, ponieważ nie oczekiwałem, że przyjaźń będzie przechodnia w klasach zagnieżdżonych.
Więc nasuwa kilka pytań:
- Co to jest prawo zachowania? Zgaduję, że jest to akceptowane przez większość kompilatorów.
- Jeśli to jest prawidłowe zachowanie, dlaczego ten przypadek przechodzenia przyjaźni jest w porządku?
- Jeśli jest to poprawne, oznacza to również zmianę standardu. Jakie mogą być przyczyny dopuszczenia tego w standardzie?
- W przypadku kompilatorów, które odrzuciły ten kod, jakie byłoby odpowiednie obejście tego problemu? Należy pamiętać, że rzeczywisty projekt może zawierać dość głębokie zagnieżdżanie, więc szukam rozwiązania, które będzie częściowo skalowalne.
1. testowany na mingw-gcc 4.5.2, brzękiem, Borland C++ builder2007, Mars cyfrowych, otwartej Watcom, visualc2010 i Comeau internetowym