簡體   English   中英

如何從另一個命名空間的全局命名空間定義一個朋友類?

[英]How do I define a friend class from the global namespace in another namespace?

在先前的問答中( 如何在另一個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進行編譯。

如該問題下方的某些評論所述,該問題中的代碼似乎可以與我一起使用(Linux-Ubuntu-16.04,gcc版本5.4.0),前提是該朋友類已被預先聲明

在尋求答案的過程中,我碰到了這篇文章 ,它們都解釋了使全局命名空間成為好友類的正確方法,並回答了為什么需要以這種方式聲明它。 這是一個不錯的線程,因為它引用了標准。

如前所述,必須先聲明全局名稱空間的類,然后才能將其用作名稱空間中的類的好友類。

如下添加前向聲明

namespace {  
  // anonymous namespace declaration
  class CBaseSD;
}

then your normal

friend class CBaseSD;// no need of ::

在CBase中工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM