2016-06-07 83 views
2

如何写需要对方的名字空间? 是这样的:两个名字空间互相需要

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

当我编译这段代码,我得到了警告,命令不是在命名空间“命令:: s_command命令;”线。

回答

3

当您使用的Command::s_command定义是不可用:

struct s_AMXe 
{ 
    Command::s_command command; 
}; 

这是有道理的编译器在该行抛出一个错误。

您可以在namespace之内转发声明名称(类,函数等),就像您可以转发声明全局名称一样。

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

此外,请记住,不像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); 
} 
0

AMXe::s_AMXe中使用之前,您需要声明Command::s_command。而且,由于它是直接包含的(与指针或引用相对),因此它需要在使用之前进行定义(所以编译器知道它的大小)。

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

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

namespace AMXe { 
    etc... 
} 

namespace Command { 
    etc... 
}