работает то, что действует как неявное предварительное объявление.

оложим, у меня есть классF это должно быть другом на урокахG (в глобальном пространстве имен) иC (в пространстве именA).

дружитьA::C, F должен быть заранее объявлен.дружитьGнет предварительной декларацииF это необходимо.также классA::BF может быть другомA::C без предварительной декларации

Следующий код иллюстрирует это и компилируется с GCC 4.5, VC ++ 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;
}

Мне это кажется противоречивым. Есть ли для этого причина или это просто дизайнерское решение стандарта?

Ответы на вопрос(1)

Ваш ответ на вопрос