在之前的Q& A(How do I define friends in global namespace within another C++ namespace?)中,解决方案用于在命名空间内创建朋友 function 定义,该命名空间引用全局命名空间中的函数。
对于类我有同样的问题。
class CBaseSD;
namespace cb {
class CBase
{
friend class ::CBaseSD; // <-- this does not work!?
private:
int m_type;
public:
CBase(int t) : m_type(t) {};
};
}; // namespace cb
class CBaseSD
{
private:
cb::CBase* m_base;
public:
CBaseSD(cb::CBase* base) : m_base(base) {};
int* getTypePtr()
{ return &(m_base->m_type); };
};
如果我将CBaseSD放入命名空间,它可以工作;例如。, 朋友类SD :: CBaseSD; 但我没有找到适用于全局命名空间的咒语。
我正在使用g ++ 4.1.2进行编译。
答案 0 :(得分:0)
如该问题下方的某些评论所述,该问题中的代码似乎可以与我一起使用(Linux-Ubuntu-16.04,gcc版本5.4.0),前提是该好友类已向前声明。
在寻求答案时,我碰到了this post,它既解释了使全局命名空间成为好友类的正确方法,又回答了为什么需要以这种方式声明它。这是一个很好的线程,因为它引用了标准。
如前所述,全局命名空间的类必须先转发声明,然后才能用作命名空间中的类的朋友类。
答案 1 :(得分:-2)
添加前面的声明,如下所示
namespace { // anonymous namespace declaration class CBaseSD; } then your normal friend class CBaseSD;// no need of ::
适用于CBase