如何根据别名对名称空间进行别名并扩展原始名称空间

时间:2017-05-05 15:19:44

标签: c++ namespaces c++14

我在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的别名来扩展此命名空间。

2 个答案:

答案 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);
}