C++ 对命名空间和别名的混淆:没有嵌套也没有 using 指令

C++ Confusion about namespaces and aliasing: no nesting and no using directives

我不是想嵌套命名空间,我是在尝试不在我的 header 中使用 using 指令。我正在尝试使用另一个名称为命名空间 'name' 添加别名。在我的 header 中,我有一个全名的全局空命名空间。我想为这个名称分配另一个名称空间,然后用我的源代码填充它。我不确定做这样的事情合适的语法是什么。这是我的 header 文件中的示例。

#ifndef SOME_HEADER_H
#define SOME_HEADER_H

namespace SomeLongNamespaceHere {} // Empty Global
namespace SLNH = SomeLongNamespaceHere; // Alias
namespace slnh = SLNH; // another lowercase alias

namespace slnh { // Compiler Error:
    // My Declarations Here!
    class foo{};    
}

#endif // SOME_HEADER_H

1>------ Build started: Project: FileTester, Configuration: Debug Win32 ------
1>  include.cpp
1>c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\include.h(8): error C2757: 'mfbid': a symbol with this name already exists and therefore this name cannot be used as a namespace name
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我理解编译器错误,这不是问题所在。


但是当我这样做时:

namespace slnh{}

namespace slnh{
    class foo{};
}

它编译得很好。我不确定我是否误解了命名空间别名的确切含义和作用,或者我是否没有使用正确的语法。


我正在尝试使用较短的版本代替较长的版本,这样用户就可以直接使用较短的版本,当他们将鼠标悬停在较短的命名空间上时,它会自动解析回较长的命名空间,并且可以通过 MSVS 的 intellisense 或类似的功能可以看到。我怎样才能实现或模仿我上面描述的行为?

您可以根据需要多次重新打开命名空间,这就是它起作用的原因:

namespace slnh{}

namespace slnh{
    class foo{};
}

但是你不能重新声明一个与别名同名的命名空间,这是一个冲突:

namespace SomeLongNamespaceHere {} // Empty Global
namespace SLNH = SomeLongNamespaceHere; // Alias
namespace slnh = SLNH; // another lowercase alias

//This namespace clashes with the alias above.
namespace slnh { // Compiler Error:
// My Declarations Here!
    class foo{};    
}

它不起作用,因为您将相同的名称关联到命名空间和命名空间别名。这会与 AFAIK 发生冲突。

编辑:您无论如何都不能打开具有别名的命名空间。所以做不到。

也许一个可能的解决方法(根本不推荐)是使用更短的命名空间并放置一个 using 指令:

namespace SomeLongNamespace {
    using namespace SLN;
}

namespace SLN {
   //Populate here
   class MyClass {};
}


SLN::MyClass ...; //works 
SomeLongNamespace::MyClass ...; //works

另一个丑陋的解决方法是使用宏(也不推荐):

#define SLN SomeLongNamespace

这可能不利于仅节省几次击键和 macros are evil 所以不要这样做。