如何使名称空间别名并根据别名扩展原始名称空间
How to Alias a namespace and extend the original namespace based on the alias
我在C 中有当前的问题:
我有一个给定外部库的命名空间。我不喜欢此外部名称空间的名称,所以我这样做了:
namespace mynamespace = othernamespace;
,如果我想说以下操作,这很好:
mynamespace::foo(...);
,但我发现我需要具有一个特殊的功能,以将othernamespace
中的值转换为外部库中的值。我以以下方式定义了一个函数:
Y xToY(mynamespace::X x);
我意识到我只想在mynamespace
的上下文中使用此功能,而且我仍然不喜欢为othernamespace
使用命名空间名称,所以我认为很简单,我会执行以下操作:
namespace mynamespace = othernamespace;
namespace mynamespace{
Y xToY(mynamespace::X x);
}
但是,我发现以下编译器错误告诉我这不能完成:
myheader.h:13:11: error: namespace alias 'mynamespace' not allowed here, assuming 'othernamespace'
因此没有编译。请注意,我目前正在使用C 14。我想知道我是否可以使用我的名称 othernamespace
的别名名称扩展此名称空间。
nope。不幸的是,这是不可能的。该规则,来自[namespace.def],明确排除别名:
在名为namespace-definition 的中,标识符是名称空间的名称。如果标识符(3.4.1(时,请参考 namespace-name (但不是 namespace-alias (引入 命名空间在其中出现 name-namespace-definition 出现或在该名称空间的内联名称空间集的成员中介绍的命名空间, em> namespace-depinition 扩展了先前宣布的名称空间。 否则,标识符将以A 命名空间名称引入声明区域,其中出现 name-namespace-definition 出现。
您不能通过别名扩展名称空间,您只能通过原始名称空间名称扩展名称空间。
通过构建一个新的名称空间而不是别名来做到这一点:
// external namespace
namespace othernamespace {
struct X {};
void foo(X& x) {};
}
// my namespace
namespace mynamespace
{
using namespace othernamespace; // equivalent to import * from othernamespace
}
int main()
{
mynamespace::X x;
foo(x);
}
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 部分定义/别名模板模板参数
- 如何使名称空间别名并根据别名扩展原始名称空间
- 使用命名空间别名编译 OpenCV
- C++对名称空间和别名的混淆:没有嵌套和使用指令
- 命名空间别名是否会更改链接?
- 依赖于参数的查找在来自另一个命名空间的别名类型上意外行为
- 专用模板是命名空间别名实际上是一个别名
- 我们可以像在名称空间中那样对类名进行别名吗
- 一个命名空间有多个别名
- 链接器是否识别命名空间别名
- 在C++中,可以重命名/别名为非命名空间、非类名
- 如何在头文件中声明名称空间别名,然后在源文件中使用它
- 名称空间别名会影响大型代码库中的构建时间吗?(c++)
- 能否在c++中向前声明一个命名空间别名?
- 命名空间别名范围问题
- 与预处理器相比,使用命名空间别名的好处
- C++整个类作用域中的命名空间别名
- 命名空间别名与定义的实际优势
- 在不同的命名空间中调用别名声明的基类构造函数