Почему можно? t Я меняю закрытый член класса из дружественного класса в другом пространстве имен?

У меня проблемы с доступом к закрытому члену класса из класса друзей.

Класс, который содержит закрытый член, который я хочу изменить, и класс, в котором производится изменение, находится в разных пространствах имен.

Класс друга определяется после класса, содержащего данные, поэтому я попытался переадресовать объявление класса друга за пределы пространства имен .

g ++ говорит, что я не могу изменить член, потому что он частный, визуальная студия, кажется, думает, что это нормально.

Не делаю ли я здесь какие-то странные нестандартные вещи? Почему можно t Я сменил участника? Вот упрощенный фрагмент, который представляет мою проблему:

struct S;

namespace N
{
    class A
    {
        int m;
    public:
        A():m(5){};
        friend struct S;
    };

}

using namespace N;

struct S
{
    A& a;
    S(A& a):a(a) {}
    void changeA(){ a.m = 9; }
};

int main()
{
    A a;
    S s(a);
    s.changeA();
}
8
задан Jacobo de Vera 14 May 2011 в 16:59
поделиться