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

C++ namespace alias in entire class scope

本文关键字:命名空间 别名 作用域 C++      更新时间:2023-10-16

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

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);
       }
    };
}

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

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

它只允许在命名空间范围或函数范围内。

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

//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"尚未声明

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

演示:http://www.ideone.com/2zyNI(尽管它没有演示 OtherFile 概念,因为我 ideone.com 不能有多个文件)

命名空间

别名的作用域是代码块。

因此,您可以将其放在任何代码块中。

但是,你不能把它放在一个类中,因为这意味着它是类的成员。
命名空间别名不能是成员。

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

C++命名空间别名的作用域是什么?
命名空间

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

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

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