C++ 在不同命名空间中友好/使用类

C++ 在不同命名空间中友好/使用类,c++,header,namespaces,friend,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之后,我找到了这个答案 这确实有助于让全班同学

如果类
G
位于命名空间
GSpace
中,并且它需要与全局命名空间中的类
M
成为朋友,那么您必须做什么?我认为这会奏效:

/////////////////////M.h//////////////////////
#include "GFile.h"

class M
{
   public:
      friend class GSpace::G; // doesn't work, throws error
}
在研究了一下StackOverflow之后,我找到了这个答案

这确实有助于让全班同学成为朋友。但是,当我实际使用该类型声明一个类成员时,会产生一个问题,因为该类没有定义。GFile.h

我是否误解了
#include
和forward声明的行为,或者是编译器方面的某种实现问题(我认为不太可能)

尝试以下方法

namespace GSpace
{
   class G;
}

class M
{
   public:
      friend class GSpace::G; 
}

namespace GSpace
{
   class G { /* definition of the class */ };
}
试试下面的方法

namespace GSpace
{
   class G;
}

class M
{
   public:
      friend class GSpace::G; 
}

namespace GSpace
{
   class G { /* definition of the class */ };
}
  • 由于您的成员不是指针或引用,编译器需要知道
    G
    的大小。您不能使用转发声明
  • 如注释中所述,您需要使用名称空间限定
    G
下面是为我编译的代码:

namespace GSpace
{
   class G
   {
   };
}

class M
{
   public:
      friend class GSpace::G;
   private:
      GSpace::G gClassMember;
};

int main() {return 0;}
  • 由于您的成员不是指针或引用,编译器需要知道
    G
    的大小。您不能使用转发声明
  • 如注释中所述,您需要使用名称空间限定
    G
下面是为我编译的代码:

namespace GSpace
{
   class G
   {
   };
}

class M
{
   public:
      friend class GSpace::G;
   private:
      GSpace::G gClassMember;
};

int main() {return 0;}

为我工作:。错误是什么?
GFile.h
是否实际定义了
GSpace::G
?错误是。。?我打赌
GFile.h
包含包含
类M
的文件,或者您缺少并需要它们。@DarkFalcon我得到的错误是,当我尝试在类M中创建G的成员时,G未定义。这两个文件都包含防护,并且没有循环依赖项(我已找到)。我将更新代码以包含此错误。@Josh:将类作为朋友不会将其名称带入本地范围。您仍然需要使用名称空间来限定它。@DarkFalcon它是(忘记将它放在模型代码中,编写它时有点匆忙:/)。关于这件事还有什么不正确的地方吗?对我来说很有用:。错误是什么?
GFile.h
是否实际定义了
GSpace::G
?错误是。。?我打赌
GFile.h
包含包含
类M
的文件,或者您缺少并需要它们。@DarkFalcon我得到的错误是,当我尝试在类M中创建G的成员时,G未定义。这两个文件都包含防护,并且没有循环依赖项(我已找到)。我将更新代码以包含此错误。@Josh:将类作为朋友不会将其名称带入本地范围。您仍然需要使用名称空间来限定它。@DarkFalcon它是(忘记将它放在模型代码中,编写它时有点匆忙:/)。还有什么看起来不正确的吗?很有道理!非常感谢。如果它是一个方法的参数,这种情况会是相同的吗?编译器是否也需要提前知道这些文件的大小?它能计算出一个参数在运行时需要多少堆栈分配吗?一个方法的参数可以被前向声明,但在声明参数类型之前不能调用该方法。这只是编译时。C++没有内置的反射或元数据,允许运行时确定方法参数大小。非常感谢。如果它是一个方法的参数,这种情况会是相同的吗?编译器是否也需要提前知道这些文件的大小?它能计算出一个参数在运行时需要多少堆栈分配吗?一个方法的参数可以被前向声明,但在声明参数类型之前不能调用该方法。这只是编译时。C++没有内置的反射或元数据,允许运行时确定方法参数大小。