如何从另一个命名空间中的全局命名空间定义友元类?

时间:2010-02-10 12:28:36

标签: c++ namespaces global friend

在之前的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进行编译。

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