C ++关于命名空间和别名的混淆:没有嵌套,也没有使用指令

时间:2017-02-09 04:13:52

标签: c++ syntax namespaces alias

我没有尝试嵌套命名空间,我试图不在头文件中使用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:\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的智能感知等功能。我怎样才能实现或模仿我上面描述的行为?

1 个答案:

答案 0 :(得分:1)

您可以根据需要多次重新打开名称空间,这就是原因:

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这可能不好 所以不要这样做。