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?
};
};
};
Эта проблема дружбы возникла, когда я пытался портировать проект с открытым исходным кодом для компиляции под borland. Согласно parashift и двум частично связанным вопросам здесь и здесь приведенный выше пример недопустим.
Однако, после тестирования на семи различных компиляторах1, только borland и dmc жаловались. Такое поведение меня удивило, потому что я не ожидал, что дружба будет транзитивной во вложенных классах.
Таким образом, это вызывает пару вопросов:
- Что такое правильное поведение? Я предполагаю, что это тот, который принят большинством компиляторов.
- Если это правильное поведение, почему этот пример транзитивности дружбы в порядке?
- Если это так, то это также будет означать изменение стандарта. Какие могут быть причины для разрешения этого в стандарте?
- Что может быть подходящим обходным путем для компиляторов, которые отвергли этот код? Имейте в виду, что реальный проект может содержать довольно глубокую вложенность, поэтому я ищу полумасштабируемое решение.
1. проверено на mingw-gcc 4.5.2, clang, borland c++ builder2007, digital mars, open watcom, visualc2010 и comeau online