[英]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
别名来扩展此命名空间。
不。 不幸的是,这是不可能的。 来自[namespace.def]的规则明确排除了别名:
在命名空间定义中 ,标识符是命名空间的名称。 如果查找标识符(3.4.1),则引用名称空间名称 (但不是名称空间别名 ) ,该名称空间名称在命名空间定义出现或在成员中引入的名称空间中引入。该命名空间的内联命名空间集,命名空间定义 扩展了先前声明的命名空间。 否则,将标识符作为名称空间名称引入到出现named-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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.