31

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

我可以撤消using namespace以使编译器忘记它以前看到过吗?

4

6 回答 6

38

不,但是您可以告诉您的同事,您永远不应该using在标题中包含指令或声明。

于 2010-01-28T07:28:11.397 回答
16

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

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

namespace D {
    using A::C; // fixes ambiguity
    C c;
}

在某些情况下,您还可以使用命名空间包装有问题的包含:

namespace offender {
#  include "offender.h"
}
于 2010-01-28T07:33:36.863 回答
6

不,C++ 标准没有提到“撤消”。您可以做的最好的事情是限制以下范围using

#include <vector>

namespace Ximpl {

using namespace std;    
vector<int> x;

}

vector<int> z; // error. should be std::vector<int>

但不幸的是using namespace Ximpl,也会带来std命名空间中的所有名称。

于 2010-01-28T07:46:36.880 回答
3

据我所知……但通常我只在 .cpp 文件中使用“使用命名空间”。

于 2010-01-28T07:27:06.173 回答
0

最接近的,我将尝试在头文件中使用如下:

//example.h

#ifndef EXAMPLE_H_
#define EXAMPLE_H_


/**
 * hating c++ for not having "undo" of using namespace xx
 */
#define string std::string
#define map std::map

class Example {
public:
    Example (const char *filename);
    Example (string filename);
    ~Example ();
private:
    map<string,complicated_stuff*> my_complicated_map;

};

#undef string
#undef map

#endif //EXAMPLE_H_

毕竟,定义是 #undef -able。有两个问题: 1. 很难看 2. 使用了从相应命名空间中为每个名称单独的#define 和 #undef

于 2013-12-13T08:35:14.347 回答
0

如前所述,您不应using namespace sth在头文件中使用。当您在实现中需要命名空间的功能时,您可以利用如下范围:

void func() {
    // some code agnostic to your namespace.
    {
        using namespace sth;
        // some code aware of sth.
    }
    // some other code agnostic to your namespace.
}
于 2022-03-06T04:41:27.830 回答