整个类范围内的 C++ 命名空间别名

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

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

最佳答案

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

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

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

//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' has not been declared

这证明了别名 abcMyFile.cpponly 可见。感谢 unnamed 命名空间。

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

关于整个类范围内的 C++ 命名空间别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6056047/

相关文章:

html - 您可以使用 id 和类名 css 选择器在另一个 namespace 中设置 XHTML 元素的样式吗?

java - 概率模拟误差不收敛

c++ - 优先级队列的重载运算符

c++ - 为并行化的 for() 循环提供线程私有(private)预分配缓冲区?

namespaces - 在目录结构中明确上下文

c++ - 在编译时引用 const 值——什么时候 const 的定义才真正可用?

类中defs的c++顺序,令人惊讶

c++ - 定义命名空间::int类

c++ - 引用文献 : am I going to go out of scope?

javascript - 如何使用 "use strict"而不修改我的实用程序对象的范围?