Предположим, что у меня есть класс F
, который должен быть знаком классам G
(в глобальном пространстве имен) и C
(в пространстве имен A
).
- чтобы быть другом
A::C
,F
должен быть объявлен вперед. - чтобы быть другом
G
, не требуется форвардное объявлениеF
. - класс
A::BF
может быть другомA::C
без прямого объявления
Следующий код иллюстрирует это и компилируется с помощью GCC 4.5, VС++ 10 и, по крайней мере, с другим компилятором.
class G {
friend class F;
int g;
};
// without this forward declaration, F can't be friend to A::C
class F;
namespace A {
class C {
friend class ::F;
friend class BF;
int c;
};
class BF {
public:
BF() { c.c = 2; }
private:
C c;
};
} // namespace A
class F {
public:
F() { g.g = 3; c.c = 2; }
private:
G g;
A::C c;
};
int main()
{
F f;
}
Мне это кажется непоследовательным. Есть ли причина для этого или это просто дизайнерское решение стандарта?