在C++中,什么是"命名空间别名"?

Mar*_*n B 146 c++ namespaces

什么是C++中的"命名空间别名"?怎么用?

Mar*_*n B 173

命名空间别名是通过不同的较短名称引用长命名空间名称的便捷方式.

举个例子,假设你想在没有using namespace指令的情况下使用Boost的uBLAS中的数字向量.每次都说明完整的命名空间很麻烦:

boost::numeric::ublas::vector<double> v;
Run Code Online (Sandbox Code Playgroud)

相反,您可以定义一个别名boost::numeric::ublas- 比如说我们要将其缩写为ublas:

namespace ublas = boost::numeric::ublas;


ublas::vector<double> v;
Run Code Online (Sandbox Code Playgroud)

  • 这些评论中的大多数都是陈旧的,但也许这是有用的反馈:我发现这个答案是谷歌搜索"c ++名称空间别名"的高排名结果.我不知道是否存在这样的事情,并且希望有一种技术可以缩短特定范围内的命名空间.也许我的查询非常幸运,但重点是......我在不知道答案的情况下点击了这个问题. (80认同)
  • +1.我真的想知道C++是否有命名空间别名以及它的语法是什么,来到这里,并找到了语法.恕我直言,回答一个人自己的问题是完全可以的. (40认同)
  • 没有冒犯......只是为了解释我为什么这样做:根据Joel在播客中的评论我的理解是即使是"入门级"问题也是公平的游戏,并且可以接受提问并回答它如果那些内容尚未以SO形式呈现,那么您自己也可以使用.但显然,这是不赞成的? (22认同)
  • 我已经用 C++ 编程好几年了,我的教科书离我很远(字面意思),而且我不记得命名空间别名的语法。感谢这个问题,只需点击一下即可找到答案。因此,无论作者如何回答自己的问题,这都是一个好问题,也是一个好答案。谢谢 :) (10认同)
  • 为了解释这个问题,SO不是也不会成为一个优秀的C++教科书的替代品.你提出的问题将由任何这样的书回答.而回答你自己问题的SO"特征"不应该被用来提供这类书籍的释义. (7认同)
  • @Martin B:我不同意这是一个入门级问题 - 事实上,过去现在提出的问题有很多明显的问题.话虽如此,人们可能会觉得你只是想为自己赢得声誉.解决这个问题的方法是将问题/答案中的一个或两个标记为"社区维基".就个人而言,我会像你一样回答问题并作为社区回答.如果问题具有优点,那么您将获得投资回报率. (4认同)
  • 回答自己的问题当然是有礼仪的,以避免激怒;在这种情况下,很明显它从来就不是一个真正的问题。例如,http://stackoverflow.com/questions/494927/stack-overflow-etiquette-for-answering-your-own-question (2认同)
  • 我认为重要的问题是这个问题是否真实”——这是你被问到的吗?这是人们想知道的吗?它是否还没有在 SO 上被问过和回答?如果你读过关于 R 社区在此处发布和回答问题的 SO 博客文章,请注意,他们选择了他们的社区*实际上一直在问*的前 X 个问题,因此它具有现实世界的相关性。随机抽取特定于语言的知识片段并发布它们这里似乎不太有用。 (2认同)

小智 7

很简单,#define不起作用.

namespace Mine { class MyClass { public: int i; }; }
namespace His = Mine;
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }
Run Code Online (Sandbox Code Playgroud)

编译好.允许您解决命名空间/类名冲突.

namespace Nope { class Oops { public: int j; }; }
#define Hmm Nope
namespace Drat { class Nope: public Hmm::Oops { void f () { j = 1; } }; }
Run Code Online (Sandbox Code Playgroud)

在最后一行,"嗯:糟糕"是一个编译错误.预处理器将其更改为Nope :: Oops,但Nope已经是类名.

  • #define是什么?也许你的答案是指问题的先前版本? (3认同)