Friending /在不同的命名空间中使用类

时间:2014-01-29 13:48:18

标签: c++ header namespaces friend

如果类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和前向声明的行为,或者它是编译器方面的某种实现问题(不太可能,我假设)?

2 个答案:

答案 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 */ };
}