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

时间:2011-05-19 08:49:17

标签: c++ namespaces scope alias

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

struct MyClass
{
    namespace abc = a_big_namespace;
    void fn() {
        abc::test();
    }
};

我可以让它工作的唯一方法是在每个函数中添加别名。

void fn() {
    namespace abc = a_big_namespace;
    abc::test();
}

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

void fn(abc::testType tt) {
    abc::test(tt);
}

有办法做我想做的事吗?

编辑:我的解决方案

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

namespace myspace
{
    namespace abc = a_big_namespace;

    struct MyClass
    {
       void fn(abc::testType tt) {
          abc::test(tt);
       }
    };
}

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

4 个答案:

答案 0 :(得分:32)

类定义中的命名空间别名为非法,由语言规范指定。

允许中仅在命名空间范围或功能范围内。

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

//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.

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

  

'myspace :: abc'尚未声明

证明别名abcMyFile.cpp中仅显示 。感谢未命名的命名空间。

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

答案 1 :(得分:1)

命名空间别名的范围是代码块。

所以你可以把它放在任何代码块中。

但是,你不能把它放在课堂里,因为这意味着它是班上的一员 命名空间别名不能是成员。

有关命名空间别名的更多信息:

What is the scope of a namespace alias in C++?
Namespaces

答案 2 :(得分:0)

如果在结构外部声明别名,则它可以正常工作。

答案 3 :(得分:0)

您当然也可以将别名放在类别之外:

namespace abc = a_big_namespace;     

struct MyClass {
    void fn()
    { abc::test(); } 
};