9

语法:

 using namespace x;

告诉编译器从命名空间 x 中查找符号。一旦你在两个命名空间中有相同的符号并且你想相互使用它们,情况就会变得很糟糕。有没有办法告诉编译器不要使用命名空间?我的意思是这样的(命名空间 x 和 y 都具有函数 a)

using namespace x;
int k = a(); //x::a is called
drop namespace x; //imaginary syntax that I am looking for
using namespace y;
int j = a(); //y::a is called

“您必须使用范围解析符号'::'”不是我正在寻找的答案。

4

3 回答 3

27

由于您不想使用范围解析,因此创建一些额外的范围:

{
    using namespace x;
    int k = a(); //x::a is called
}
{
    using namespace y;
    int j = a(); //y::a is called
}

不过,恐怕这可能会比范围分辨率更糟糕:/

编辑:

可能有用的另一件事(我不知道您是否知道)是名称空间别名。假设您有一个名称长得令人作呕的名称空间或多个嵌套的名称空间。您可以缩短名称,例如:

namespace x = very::weird::namespc::name;
namespace y = yabadabadoopdiedoo;
于 2013-04-18T21:18:10.937 回答
8

您不能“删除”命名空间,但是,在使用命名空间组合时,您可以解决特定的歧义,如下所示:

namespace composite {
    using namespace x;
    using namespace y;
    using y::a; // use y::a in case of ambiguity

    void foo() {
        a(); // calls y::a
    }
}
于 2013-04-18T21:39:04.257 回答
6

2 using-directive 指定指定命名空间中的名称可以在 using-directive 出现在 using-directive 之后的范围内使用。在非限定名称查找 (3.4.1) 期间,名称看起来好像它们是在最近的封闭命名空间中声明的,其中包含使用指令和指定命名空间。[注:在此上下文中,“包含”是指“直接或间接包含”。——尾注]

因此,您必须使用不同的范围。使用后没有办法不使用。

于 2013-04-18T21:21:00.353 回答