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

发布于 2024-08-21 02:59:05 字数 755 浏览 9 评论 0原文

在之前的问答中(如何我是否在另一个 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 进行编译。

In a previous Q&A (How do I define friends in global namespace within another C++ namespace?), the solution was given for making a friend function definition within a namespace that refers to a function in the global namespace.

I have the same question for classes.

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); };
};

If I put CBaseSD into a namespace, it works; e.g.,
friend class SD::CBaseSD;
but I have not found an incantation that works for the global namespace.

I am compiling with g++ 4.1.2.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

飘落散花 2024-08-28 02:59:05

正如问题下面的一些评论中所述,问题中的代码似乎适合我(Linux-Ubuntu-16.04,gcc 版本 5.4.0),前提是友元类是前向声明的

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

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

As stated in some of the comments below the question, the code in the question appears to work with me (Linux-Ubuntu-16.04, gcc version 5.4.0), provided that the friend class was forward-declared.

In pursuit of an answer, I came across this post that both explains proper technique for making friend class of a global namespace and answers why it needs to be declared the way it does. It is a nice thread because it references the standard.

As stated earlier, the class of a global namespace must be forward declared before it can be used as a friend class to a class within a namespace.

各自安好 2024-08-28 02:59:05

添加前向声明,如下所示

namespace {  
  // anonymous namespace declaration
  class CBaseSD;
}

then your normal

friend class CBaseSD;// no need of ::

在 CBase 中有效

add the forward declaration like below

namespace {  
  // anonymous namespace declaration
  class CBaseSD;
}

then your normal

friend class CBaseSD;// no need of ::

works in CBase

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文