【问题标题】:Telling the compiler that I am no longer using a namespace in C++告诉编译器我不再使用 C++ 中的命名空间
【发布时间】:2013-04-18 21:16:05
【问题描述】:

语法:

 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

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

【问题讨论】:

  • 你为什么不想使用范围解析??
  • “医生,医生,我这样做的时候好痛!”
  • 首先不要使用using namespace
  • 确实如此,但我想知道你是不是没抓住重点。
  • Nitpick:你不能不使用范围解析。没有resolution,所有的东西都是unresolved定义的,任何程序都不会被链接。你的意思(我认为)是我不想对标识符的使用做明确的命名空间限定。

标签: c++ syntax namespaces


【解决方案1】:

既然你不想使用范围解析,那就创建一些额外的范围:

{
    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;

【讨论】:

  • 很高兴它有帮助,如果你的同事因此而批评你,请不要怪我;)
  • OP 非常讨厌 Krillin。无论如何,只是一个建议。如果您使用 C++ 编程,请使用 C++ 编程。我不想成为维护您的代码的人。
  • @GreenCode 不,省略它们会使事情变得复杂。
  • @GreenCode 这不是您的个人帮助台,鼓励以这种特殊方式解决这个~~问题~~的答案对以后会偶然发现这个问题的人有害。您的英文单词完全不相关,因为它只是 XY 问题的标志(即您发明了一个解决方案并想知道如何实现它,但它一开始就不是正确的解决方案)。
  • @CatPlusPlus:我无意伤害任何人的知识,如果我对任何人表现出不尊重,我感到非常抱歉。我只想问这在 C++ 中是否可行。我认为这个问题有一个正确的答案,它是我选择的那个。再次,我很抱歉我的不礼貌,但请理解,在我的问题正文中,我提到使用范围解析不是我想要的。
【解决方案2】:

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

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

    void foo() {
        a(); // calls y::a
    }
}

【讨论】:

  • 现在这很奇怪,也许我错过了什么。您是否检查了我更新评论中的链接? (顺便说一句,我没有投反对票)
  • 你需要缩小最后一个 using 语句的范围。 Example. 或者,更好的是,reduce the scope of all using directive.
  • IIRC 它仅在全局命名空间中不起作用。 (此功能称为“命名空间组合顺便说一句。所以它是有道理的..)
  • using namespace a 之后添加using y::a 不会增加任何内容,AFAIK。它只是将名称 a 插入到封闭的命名空间中,这已经发生了。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2011-10-23
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多