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

Ami*_*deh 9 c++ syntax namespaces

语法:

 using namespace x;
Run Code Online (Sandbox Code Playgroud)

告诉编译器从命名空间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
Run Code Online (Sandbox Code Playgroud)

"你必须使用范围解析符号'::'"不是我要找的答案.

jro*_*rok 27

由于您不想使用范围解析,因此请创建一些其他范围:

{
    using namespace x;
    int k = a(); //x::a is called
}
{
    using namespace y;
    int j = a(); //y::a is called
}
Run Code Online (Sandbox Code Playgroud)

我担心这可能会比范围解决更糟糕:

编辑:

还有一件事(我不知道,如果你知道的话)可能有用的是命名空间别名.假设你有一个带有令人厌恶的长名称或多个嵌套命名空间的命名空间.您可以缩短名称,例如:

namespace x = very::weird::namespc::name;
namespace y = yabadabadoopdiedoo;
Run Code Online (Sandbox Code Playgroud)

  • @GreenCode不,省略它们会让它变得复杂. (9认同)
  • @GreenCode这不是你个人的帮助台,并且鼓励解决这个问题的答案~~以这种特殊的方式对以后偶然发现这个问题的人有害.你的英语单词是无关紧要的,因为它只是XY问题的一个标志(即你发明了一个解决方案并希望知道如何实现它,但它首先不是正确的解决方案). (7认同)
  • OP糊恨Krillin.无论如何,只是一个建议.如果您使用C++编程,请使用C++编程.我不想成为维护代码的人. (3认同)
  • @CatPlusPlus:我并不是说对任何人的知识有任何伤害,如果我对任何人表示不尊重,我感到非常抱歉.我只是想问一下C++中是否可行.这个问题在我看来是正确的答案,而且是我选择的问题.再次,我很抱歉我的不礼貌,但请理解,在我的问题机构中,我提到使用范围解析并不是我想要的. (3认同)
  • 很高兴它有所帮助,如果你的同事解雇你,就不要怪我;) (2认同)
  • @GreenCode当你说'没有范围解析'时,这是惊人的jrok的回答正是我认为你不想使用的.我的错误,我删除了我的评论. (2认同)
  • @GreenCode你怎么会发现```丑陋的OpenCV?命名空间是有原因的. (2认同)

Sta*_*ked 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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • IIRC它仅在全局名称空间中不起作用。(此功能称为“命名空间组合”。所以这很有意义。) (2认同)

ale*_*der 6

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

因此,您必须使用不同的范围.使用后无法取消使用.