我可以在C++中撤消"using namespace"的效果吗?

sha*_*oth 31 c++ namespaces using

using namespace不使用命名空间限定符的情况下,我可以直接看到该命名空间的全部内容.如果using namespace在广泛使用的头文件中发生这可能会导致问题- 我们可能无意中使两个具有相同类名称的名称空间可见,并且编译器将拒绝编译,除非类名称前缀为名称空间限定符.

我可以撤消,using namespace以便编译器忘记它之前看到它吗?

rlb*_*ond 37

不,但你可以告诉你的同事你不应该using在标题中有指令或声明.

  • 不幸的是,第三方库 (https://opencv.org/platforms/cuda.html) 需要这样做,我们无法重写它。这看起来不像是一个答案,很多事情在生活中是应该避免的,但却是不可避免的。 (2认同)

Geo*_*che 16

正如其他人所说,你不能,问题不应该在那里.
您可以做的下一个最好的事情是引入您需要的符号,以便通过名称查找首选符号:

namespace A { class C {}; }
namespace B { class C {}; }
using namespace A;
using namespace B;

namespace D {
    using A::C; // fixes ambiguity
    C c;
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,您还可以使用命名空间包装违规包含:

namespace offender {
#  include "offender.h"
}
Run Code Online (Sandbox Code Playgroud)

  • 最后一种技术可能是一种蠕虫病毒.如果offender.h包含"#define"保护的标题,那么现在这些符号会被卡在罪犯中.您可以尝试将其整个接口包全面放在新的命名空间中,但仍希望它不包含系统头.如果它工作一次,它可能会破坏下一个版本. (7认同)
  • 因此*在某些情况下*. (2认同)

Kir*_*sky 6

不,C++标准没有说"撤消".您被允许做的最好是限制范围using:

#include <vector>

namespace Ximpl {

using namespace std;    
vector<int> x;

}

vector<int> z; // error. should be std::vector<int>
Run Code Online (Sandbox Code Playgroud)

但遗憾的是,它using namespace Ximpl还会带来名称std空间中的所有名称.