2016-06-07 86 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... 
}