如何使名称空间别名并根据别名扩展原始名称空间

How to Alias a namespace and extend the original namespace based on the alias

本文关键字:别名 空间 扩展 原始 何使名      更新时间:2023-10-16

我在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);
}