整个类作用域中的C++名称空间别名

Ant*_*Ant 32 c++ alias scope namespaces

我希望能够在类声明中使用命名空间别名,但是会出现编译器语法错误.

struct MyClass
{
    namespace abc = a_big_namespace;
    void fn() {
        abc::test();
    }
};
Run Code Online (Sandbox Code Playgroud)

我可以让它工作的唯一方法是将别名放在每个函数中.

void fn() {
    namespace abc = a_big_namespace;
    abc::test();
}
Run Code Online (Sandbox Code Playgroud)

另外,我希望能够使用函数参数的别名.我没有找到解决办法.

void fn(abc::testType tt) {
    abc::test(tt);
}
Run Code Online (Sandbox Code Playgroud)

有办法做我想要的吗?

编辑:我的解决方案

我发现我的特定问题并不需要未命名的命名空间,只需这样做:

namespace myspace
{
    namespace abc = a_big_namespace;

    struct MyClass
    {
       void fn(abc::testType tt) {
          abc::test(tt);
       }
    };
}
Run Code Online (Sandbox Code Playgroud)

要切换到另一个库,这是我的别名命名空间引用的,我只需更改别名.这种方法甚至允许我在一个文件中有两次相同的类,每次都引用一个不同的库.感谢你的帮助.

Naw*_*waz 33

类定义中的命名空间别名是非法的,如语言规范所指定.

允许在命名空间范围或功能范围内.

您可以在命名空间范围内创建别名.但这将成为永久别名,也可以从其他文件中使用.但解决方案很简单:您可以使用命名的命名空间来防止别名(因此来自大命名空间的所有符号)从其他文件中可见.这是如何做到的:

//MyFile.cpp
namespace myspace
{ 
    namespace   //this is unnamed namespace
    {
       namespace abc = a_big_namespace;     
    }
    struct MyClass 
    {
      void fn() 
      { 
         abc::test();  //don't worry, this will work!
      } 
    };
}

//OtherFile.cpp

myspace::abc::test(); //error - that means, prevention worked.
Run Code Online (Sandbox Code Playgroud)

别名在其他文件中不可见.编译时OtherFile.cpp,GCC(4.5.0)说,

'myspace :: abc'尚未申报

这证明别名在中abc可见.感谢命名的命名空间.MyFile.cpp

演示:http://www.ideone.com/2zyNI(虽然它没有演示OtherFile概念.我在ideone.com上不能有多个文件)

  • 我不确定这有什么帮助。无论如何,在其他任何地方都看不到cpp文件中的Namspace别名。匿名名称空间AFAIK用于避免通过静态链接导出/冲突函数或数据的符号。 (4认同)
  • 请注意此处所述的解决方法:虽然确实在不同的cpp文件中看不到这些别名,但在其他头文件中却可以看到它们。因此,例如,如果您在一个头文件中应用此替代方法,则项目中的所有其他头文件都可以使用相同的别名,而不管周围的名称空间如何。您将无法将相同的别名分配给项目中任何其他头文件中的其他命名空间,并且只能在单个头文件中定义一次给定的别名。对于Visual Studio 2013来说确实如此,在其他平台上可能不一样。 (2认同)