C++对名称空间和别名的混淆:没有嵌套和使用指令



我不是在嵌套命名空间,而是在头中尝试不使用using指令。我正在尝试将命名空间"name"别名为另一个名称。在我的标题中,我有一个全局的空名称空间和一个完整的名称。我想给这个名称分配另一个名称空间,然后用我的源代码填充它。我不确定做这种事情的合适语法是什么。下面是我头文件中的一个示例。

#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:usersskilz80documentsvisual studio 2015projectsfiletesterfiletesterinclude.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的intelligense或类似功能来查看。我如何实现或模仿我上面描述的行为?

您可以根据需要多次重新打开名称空间,这就是为什么它有效:

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

这可能不利于只保存几个击键,而宏则是有害的所以不要这么做。

最新更新