【发布时间】:2014-01-29 13:48:17
【问题描述】:
如果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 和前向声明的行为方式,还是编译器方面的某种实现问题(我假设不太可能)?
【问题讨论】:
-
为我工作:ideone.com/l9s72G。错误是什么?
GFile.h是否真的定义了GSpace::G? -
错误是..?我敢打赌
GFile.h包含包含class M的文件,或者您缺少include guards 并需要它们。 -
@DarkFalcon 我得到的错误是当我尝试在类 M 中创建 G 的成员时,G 未定义。两个文件都包含保护,并且没有循环依赖(我有成立)。我将更新我的代码以包含此错误。
-
@Josh:让一个类成为朋友不会将它的名字带入本地范围。您仍然需要使用命名空间对其进行限定。
-
@DarkFalcon 是的(忘了把它放在模型代码中,写的时候有点匆忙:/)。还有什么看起来不正确的吗?
标签: c++ header namespaces friend