如果类G
位于命名空间GSpace
中,并且它需要与全局命名空间中的类M
成为朋友,那么您需要做什么?我认为这样可行:
/////////////////////M.h//////////////////////
#include "GFile.h"
class M
{
public:
friend class GSpace::G; // doesn't work, throws error
}
稍微研究了StackOverflow之后,我找到了这个答案https://stackoverflow.com/a/3843743/1797424
/////////////////////M.h//////////////////////
namespace GSpace
{
class G;
}
class M
{
public:
friend class GSpace::G; // works, no error
private:
GSpace::G gClassMember; // errors: "M uses undefined class GSpace::G"
};
// Note that G.h includes M.h so I do not include it here,
// instead I have it included in M.cpp
这对于让这个班级变得友好有用。但是,当我实际使用该类型声明类成员时,它会产生一个问题,因为该类未定义。 GFile.h
我是否误解了#include
和前向声明的行为,或者它是编译器方面的某种实现问题(不太可能,我假设)?
答案 0 :(得分:2)
G
的大小。你不能使用前瞻声明。G
。以下是编译给我的代码:
namespace GSpace
{
class G
{
};
}
class M
{
public:
friend class GSpace::G;
private:
GSpace::G gClassMember;
};
int main() {return 0;}
答案 1 :(得分:0)
尝试以下
namespace GSpace
{
class G;
}
class M
{
public:
friend class GSpace::G;
}
namespace GSpace
{
class G { /* definition of the class */ };
}