在将类封装在名称空间中之后,Friend函数无法再访问类的私有数据成员

时间:2018-08-18 15:42:41

标签: c++ namespaces friend

我有一个名为Circle的类,它封装在名称空间中。

namespace my_name_space {
    class Circle;
}

class my_name_space::Circle {
private:
    double radius;
public:
    friend std::ostream& operator << (std::ostream &os, const Circle &c);
};

以下是实现文件中的功能:

std::ostream& operator << (std::ostream &os, const Circle &c)
{
    os << "Radius: " << c.radius;

    return os;
}

在将类封装到名称空间中之前,一切正常。现在,朋友功能无法再访问私有数据成员。我不明白怎么了。

1 个答案:

答案 0 :(得分:4)

当您将operator <<声明为Circle的{​​{3}}时,它将成为Circle最内层的命名空间的成员。这意味着当您将Circle放入命名空间my_name_space时,operator <<也会成为命名空间my_name_space的成员。 operator<<的定义与此不匹配,它在全局范围内定义了operator<<

  

在类或类模板X的朋友声明中首先声明的名称成为X的最内层命名空间的成员

您可以将operator<<的定义移到命名空间my_name_space中:

namespace my_name_space {
    std::ostream& operator << (std::ostream &os, const Circle &c) {
        ...
    }
}

或者如果您仍然想将operator<<保留在全局范围内:

// delcaration
std::ostream& operator << (std::ostream &os, const my_name_space::Circle &c);
class my_name_space::Circle {
    ...
    friend std::ostream& ::operator << (std::ostream &os, const Circle &c);
    //                   ~~
};
// definition
std::ostream& operator << (std::ostream &os, const my_name_space::Circle &c) {
    ...
}