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

Posted

技术标签:

【中文标题】整个类范围内的 C++ 命名空间别名【英文标题】:C++ namespace alias in entire class scope 【发布时间】:2011-08-28 16:50:48 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

如果您在结构之外声明别名,它会起作用。

【讨论】:

感谢空间,看我给博的回复。【参考方案2】:

你当然也可以把别名放在类之外:

namespace abc = a_big_namespace;     

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

【讨论】:

我的要求是将命名空间限制在类中,因为我使用相同的别名来引用两个不同的库,具体取决于我使用的类。所以是的,它有效,但不符合我的要求。不过感谢您的想法。【参考方案3】:

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

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

您可以在命名空间范围内创建别名。但这将成为永久别名,也可以从其他文件中使用。但解决方案很简单:您可以使用 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' 尚未声明

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

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

【讨论】:

非常感谢 Nawaz,我没有意识到类范围的别名是非法的,我也不知道解决方法。我遇到了匿名名称空间,所以我将完全按照您的建议实现我的代码。再次感谢。 对此处描述的解决方法的警告:虽然这些别名在不同的 cpp 文件中是不可见的,但它们在其他头文件中是可见的。因此,例如,如果您在一个头文件中应用此解决方法,则项目中的每个其他头文件都可以使用相同的别名,而不管周围的命名空间如何。您将无法在项目的任何其他头文件中将相同的别名分配给不同的命名空间,并且您只能在单个头文件中定义给定别名一次。这适用于 Visual Studio 2013,在其他平台上可能不一样。 " 可以在命名空间范围内创建别名。但这将成为永久别名,也可以从其他文件中使用。" - 您能否提供跨编译单元可见的命名空间别名的参考? 我不确定这有什么帮助。无论如何,在其他任何地方都看不到 cpp 文件中的命名空间别名。匿名命名空间 AFAIK 用于避免使用静态链接导出/冲突函数或数据的符号。 如果MyClass需要在头文件中定义怎么办?有解决办法吗?【参考方案4】:

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

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

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

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

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

【讨论】:

很抱歉,您的回答不能令人满意。类和命名空间非常相似。但是我们可以有内部类。我们甚至可以有内部类型定义和基本方法的内部使用。甚至内部静态断言!因此,恕我直言,没有任何内部命名空间听起来像是委员会做出的完全武断的判断。

以上是关于整个类范围内的 C++ 命名空间别名的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中,啥是“命名空间别名”?

不同命名空间内的类的循环依赖 C++

实际场景中的代表:在命名空间范围内的类范围内

如何在另一个 C++ 命名空间内的全局命名空间中定义朋友?

static关键字在命名空间范围内没用吗?

C++ 命名空间 (namespace)