我有一个名为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;
}
在将类封装到名称空间中之前,一切正常。现在,朋友功能无法再访问私有数据成员。我不明白怎么了。
答案 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) {
...
}