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; eg, 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.
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.
add the forward declaration like below
namespace { // anonymous namespace declaration class CBaseSD; } then your normal friend class CBaseSD;// no need of ::
works in CBase
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.