如何编写需要彼此的命名空间? 像这样的东西:
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;
};
}
当我编译这段代码时,我得到警告说Command不是&#34; Command :: s_command命令中的命名空间;&#34;线。
答案 0 :(得分:3)
使用时无法使用Command::s_command
的定义:
struct s_AMXe
{
Command::s_command command;
};
编译器在该行抛出错误是有道理的。
您可以在namespace
内转发声明名称(类,函数等),就像您可以转发声明全局名称一样。
之后,您可以使用指针和对这些类型的引用。但是,要在class
中使用namespace
的对象,必须先定义class
。
另外,请记住,与class
es不同,namespace
可以分为多个块。
您可以重新组织代码,如下所示:
// 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);
}
答案 1 :(得分:0)
在Command::s_command
中使用AMXe::s_AMXe
之前,您需要声明s_command
。此外,由于它是直接包含的(而不是指针或引用),因此需要在使用前定义(因此编译器知道它的大小)。
在这种特殊情况下,解决方案很简单。移动前面namespace Command {
struct s_command {
int OnPlayerCommandReceived;
int OnPlayerCommandPerformed;
};
}
namespace AMXe {
etc...
}
namespace Command {
etc...
}
的定义:
MVC 4