Распространяется ли «дружба» класса на классы, объявленные в этом классе?

У меня есть следующий код, в котором класс A объявляет класс B своим другом. Должен ли класс C, объявленный в классе B, иметь возможность просматривать частные объявления / члены класса A?

Он компилируется без ошибок с CL версии 16 (Visual Studio 2010), но gcc g ++ версии 4.1.1 выдает ошибку "typedef" int A :: T является закрытым в этом контексте ".

Такое же поведение происходит с вызовами функций как typedef (именно так я обнаружил разницу).

class A {
   friend class B;
   typedef int T;
};

class B {
   A::T t; // ok
   typedef A::T U; // ok
   class C {
      U u; // ok
      A::T v; // compile error on gcc
   };
};

Я провел краткий поиск, но не смог найти подходящие условия поиска. Я еще не прочитал стандарт. Были ли какие-либо предыдущие вопросы по этой теме или упомянутые в FAQ по C ++? Какое поведение подразумевается стандартом?

15
задан Jack V. 12 May 2011 в 08:37
поделиться