5

在之前的问答(如何在另一个 C++ 命名空间中定义全局命名空间中的朋友?)中,给出了在引用全局命名空间中的函数的命名空间中定义朋友函数的解决方案。

我对课程有同样的问题。

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 进行编译。

4

2 回答 2

2

正如问题下方的一些评论中所述,问题中的代码似乎适用于我(Linux-Ubuntu-16.04,gcc 版本 5.4.0),前提是朋友类是forward-declared

为了寻求答案,我遇到了这篇文章,它既解释了建立全局命名空间的朋友类的正确技术,又回答了为什么需要以它的方式声明它。这是一个很好的线程,因为它引用了标准。

如前所述,全局命名空间的类必须先前向声明,然后才能用作命名空间内的类的友元类。

于 2019-06-07T20:00:25.927 回答
-1

添加如下的前向声明

命名空间{  
  // 匿名命名空间声明
  CBaseSD 类;
}

那么你的正常

朋友类 CBaseSD;// 不需要 ::

在 CBase 中工作

于 2010-05-14T19:34:36.690 回答