两个命名空间需要彼此

时间:2016-06-07 04:51:35

标签: 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
{
    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;线。

2 个答案:

答案 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