如何在标题中包含名称空间而不将其注入客户端?

时间:2016-10-14 15:34:53

标签: c++ namespaces static-libraries using

我有很多遗留代码,我希望组织得更好,并将我们的库放入命名空间。

因此,我有一堆#include"我的图书馆的标题。"

我想移动"我的图书馆内容"进入各种命名空间,例如:

namespace Toolbox::AFX;  // application framework extensions

但是我不断地反对C ++的规则(限制),因为我允许在命名空间注入的​​地方使用。

我想#include我的一些客户端标头中的标头 - 所以我可以访问各种库设施和类 - 但我想转身并注入这些名称空间马上回到我客户的翻译单位!

e.g。

#include "AccelTable.h"  // my library's ACCEL management class lives here

class Foo
{
   CAccelTable   m_hotkeys;     // use the darn thing
   ...
};

但如果我把它放在名称空间内,CAccelTable就不再有效了。

我无法做到显而易见:

class Foo
{
   using namespace Toolbox::AFX;   // <<-- error
   CAccelTable   m_hotkeys;     // use the darn thing
   ...
};

和IIRC,这会将命名空间注入调用者:

#include "AccelTable.h"  // my library's ACCEL management class lives here
using namespace Toolbox::AFX;  // d'oh - now all my clients are forced to enjoy this entire namespace in their translation units!  YUK!

class Foo
{
   CAccelTable   m_hotkeys;     // use the darn thing
   ...
};

现在,我知道我可以做一些恼人而乏味的事情:

class Foo
{
   Toolbox::AFX::CAccelTable   m_hotkeys;     // use the darn thing
   ...
};

class Foo
{
   using CAccelTable = Toolbox::AFX::CAccelTable;
   CAccelTable   m_hotkeys;     // use the darn thing
   ...
};

我有这个权利吗?

有更好的方法吗?这似乎是令人讨厌的必须经历成堆的标题,而不仅仅是为客户端标题添加单个using namespace,但必须在每个使用它们的类或类型中使用别名命名每个类或类型!这相当于大量的编辑。

0 个答案:

没有答案