在C++中告诉编译器我不再使用命名空间

9

语法:

 using namespace x;

使用using指令可以告诉编译器从命名空间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

我不是在寻找“必须使用作用域解析符'::'”这个答案。

16
为什么你不想使用作用域解析运算符? - jsedano
7
医生,医生,当我这样做时会疼! - Pete Becker
9
不要在代码的开头使用 using namespace - Cat Plus Plus
11
确实如此,但我想知道你是否只是没有理解重点。 - Etienne de Martel
5
吹毛求疵:你不能不使用作用域解析符。没有“解析”,根据定义,一切都是“未解析的”,没有任何程序会被连接起来。我认为你的意思是我不想在标识符使用时进行显式命名空间限定。 - sehe
显示剩余8条评论
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;

2
很高兴能帮到你,只是如果你的同事因此而对你不满,请不要责怪我 ;) - jrok
3
OP似乎很讨厌克林。无论如何,这是一个建议:如果你要用C++编程,就用C++编程。否则维护你的代码的人会很痛苦。 - ArgumentNullException
9
@GreenCode 不,省略它们会让事情变得更复杂。 - Cat Plus Plus
7
@GreenCode,这不是你的个人帮助台,鼓励解决此问题的特定方法的答案会对日后遇到此问题的人造成积极的伤害。你的英文词汇相当无关紧要,因为这只是XY问题的标志(即你发明了一个解决方案,想知道如何实施它,但首先并不是正确的解决方案)。 - Cat Plus Plus
3
@CatPlusPlus:我并没有对任何人的知识造成任何伤害,如果我表现出不尊重任何人,我非常抱歉。我只是想问一下在C++中是否可能实现这个功能。在我看来,这个问题有一个正确的答案,而我选择了那个答案。再次,非常抱歉我的无礼举止,但请理解,在我的问题描述中,我提到不希望使用作用域限定符号。 - Amir Zadeh
显示剩余14条评论

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
    }
}

现在这很奇怪,也许我漏掉了什么。你有检查我更新评论中的链接吗?(顺便说一下,我没有投反对票) - jrok
1
你需要缩小最后一个using语句的范围。示例。 或者,更好的方法是缩小所有using指令的范围。 - StackedCrooked
2
如果我没记错的话,它只在全局命名空间中不起作用。(顺便说一下,这个特性叫做“命名空间组合”,所以这是有道理的..) - StackedCrooked
1
using namespace a 后面添加 using y::a 并没有什么作用,据我所知。它只是将名称 a 插入到已经存在的封闭命名空间中。 - sehe
@jrok:如果我们嵌套这些块,那么符号是否会被解析到最近的命名空间一直到外部块?还是会存在歧义?我只是好奇,并不是真的要嵌套它们。 - Amir Zadeh
显示剩余5条评论

6

使用指令指定了被提名的命名空间中的名称可以在使用指令之后的范围内使用。在未限定名称查找(3.4.1)期间,这些名称会出现在最近封闭包含使用指令和被提名命名空间的命名空间中,就好像它们是在该命名空间中声明的一样。[注意:在此上下文中,“包含”表示“直接或间接包含”。—end note]

因此,您必须使用不同的作用域。没有取消使用的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接