1

基本上我在一个 namspace 下有 2 个类,我想让一个类的方法之一(调用它B::fun)访问另一个类的私有成员(调用它class A)。但是,我似乎无法让它工作。这是一个说明问题的简单示例:

namespace ABC // this could be global too
{
    class A;

    class B
    {
    public:
        int fun(A member);
    };

    class A
    {
    public:
        friend int B::fun(A member);

    private:
        int aint;
    };

    int B::fun(A member)
    {
        return member.aint; // error: member ABC::A::aint is inaccessible
    }
}

为什么我会收到此错误?

注意:似乎是编译器问题(使用 VC++ 11)。

4

2 回答 2

3

实际上,对于 G++ 4.8.1 和 CLang++ 3.3,我在行中遇到了一个错误friend

克++error: 'int ABC::B::fun(ABC::A)' is private

铿锵++error: friend function 'fun' is a private member of 'ABC::B'

也就是说,错误是ABC::B::fun()私有的,因此朋友声明失败,然后您发出信号的行因此失败。

发生这种情况是因为您无法结交无法访问的朋友。

解决办法是ABC::B::fun()公开,或者交朋友B,或者类似的东西。

顺便说一句,命名空间与您的错误无关,但如果您的朋友声明简单,IMO 会更清楚:

friend int B::fun(A member);

因为您已经在 namespace 内ABC

于 2013-09-12T00:21:32.193 回答
2

在里面更改你的朋友声明A

class A {
    friend class B;
    int aint;
};

或者,要仅与单个方法交朋友,您需要交A朋友,B因为您正在使用的方法friend是私有的。或者你可以fun(A)公开。

namespace ABC
{
    class A;

    class B
    {
        friend class A;
        int fun(A member);
    };

    class A
    {
        friend int B::fun(A);
        int aint;
    };

    int B::fun(A member)
    {
        return member.aint;
    }
}
于 2013-09-12T00:23:04.870 回答