C++ 两个名称空间相互需要

C++ 两个名称空间相互需要,c++,C++,如何编写相互需要的名称空间? 大概是这样的: namespace AMXe { void Register(AMX *amx); void Release(AMX *amx); struct s_AMXe { Command::s_command command; }; extern std::unordered_map<AMX*, s_AMXe*> *list; } namespace Command { e

如何编写相互需要的名称空间? 大概是这样的:

namespace AMXe
{
    void Register(AMX *amx);
    void Release(AMX *amx);
    struct s_AMXe
    {
        Command::s_command command;
    };
    extern std::unordered_map<AMX*, s_AMXe*> *list;
}

namespace Command
{
    extern DWORD OnPlayerCommandText_Addr;

    void Initialize();
    void RegisterAllFromAmx(AMX* amx, AMXe::s_AMXe* amxData);
    cell Command_AddAltNamed_N(AMX *amx, cell *params);
    struct s_command
    {
        int OnPlayerCommandReceived;
        int OnPlayerCommandPerformed;
    };
}
名称空间AMXe
{
无效登记簿(AMX*AMX);
无效释放(AMX*AMX);
结构s_AMXe
{
命令::s_命令;
};
外部标准::无序地图*列表;
}
名称空间命令
{
外部DWORD OnPlayerCommandText_Addr;
void初始化();
无效寄存器alFrommx(AMX*AMX,AMXe::s_AMXe*amxData);
单元命令\u AddAltNamed\u N(AMX*AMX,cell*params);
结构s_命令
{
int OnPlayerCommandReceived;
int ONPLAYER命令已执行;
};
}

当我编译这段代码时,我得到警告,命令不是“Command::s_Command;”行中的命名空间。

AMXe::s_AMXe
中使用它之前,需要声明
Command::s_Command
。此外,由于它是直接包含的(而不是指针或引用),所以在使用之前需要定义它(这样编译器就知道它的大小)

在这种特殊情况下,解决方案很简单。将
s_命令的定义移动到前面:

namespace Command {
    struct s_command {
        int OnPlayerCommandReceived;
        int OnPlayerCommandPerformed;
    };
}

namespace AMXe {
    etc...
}

namespace Command {
    etc...
}

当您使用以下命令时,
Command::s_Command
的定义不可用:

struct s_AMXe
{
    Command::s_command command;
};
编译器在该行抛出错误是有道理的

您可以在
命名空间中转发声明名称(类、函数等),就像您可以转发声明全局名称一样

之后,您可以使用指针和对这些类型的引用。但是,要在
命名空间
中使用
的对象,必须首先定义

另外,请记住,与
class
es不同,
namespace
s可以划分为多个块

您可以按如下所示重新组织代码:

// Define Command::s_command first.
namespace Command
{
   struct s_command
   {
      int OnPlayerCommandReceived;
      int OnPlayerCommandPerformed;
   };
}

namespace AMXe
{
   void Register(AMX *amx);
   void Release(AMX *amx);
   struct s_AMXe
   {
      Command::s_command command;
   };
   extern std::unordered_map<AMX*, s_AMXe*> *list;
}

// Define rest of Command namespace
namespace Command
{
   extern DWORD OnPlayerCommandText_Addr;

   void Initialize();
   void RegisterAllFromAmx(AMX* amx, AMXe::s_AMXe* amxData);
   cell Command_AddAltNamed_N(AMX *amx, cell *params);
}
//首先定义命令::s_命令。
名称空间命令
{
结构s_命令
{
int OnPlayerCommandReceived;
int ONPLAYER命令已执行;
};
}
名称空间AMXe
{
无效登记簿(AMX*AMX);
无效释放(AMX*AMX);
结构s_AMXe
{
命令::s_命令;
};
外部标准::无序地图*列表;
}
//定义命令命名空间的其余部分
名称空间命令
{
外部DWORD OnPlayerCommandText_Addr;
void初始化();
无效寄存器alFrommx(AMX*AMX,AMXe::s_AMXe*amxData);
单元命令\u AddAltNamed\u N(AMX*AMX,cell*params);
}