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);
}