我在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
的别名来扩展此命名空间。
答案 0 :(得分:4)
不。不幸的是,这是不可能的。来自[namespace.def]的规则明确排除了别名:
在 named-namespace-definition 中,标识符是命名空间的名称。如果标识符在查找(3.4.1)时引用的是名称空间名称 (但不是名称空间别名),那是介绍中 出现 named-namespace-definition 的名称空间,或者在该名称空间的内联名称空间集合的成员中引入的名称空间, namespace-definition extends 先前声明的命名空间。 否则,标识符将作为 namespace-name 引入到 named-namespace-definition 出现的声明区域中。
您不能通过别名扩展名称空间,只能通过原始名称空间名称扩展名称空间。
答案 1 :(得分:3)
通过构建新的命名空间而不是别名来实现:
// 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);
}