在命名空间中使用指令导致的错误示例

Example of error caused by using directive in namespaces

我试图了解在命名空间中包含 using 声明会引起什么样的错误。我正在考虑 these links.

我正在尝试创建一个示例,其中由于使用了 using 声明,导致错误的原因是一个名称被一个 header 文件悄悄替换,该文件先于另一个文件加载.

这里我定义MyProject::vector:

// base.h
#ifndef BASE_H
#define BASE_H

namespace MyProject
{
    class vector {};
}

#endif

这是 "bad" header:这里我试图欺骗 using 隐藏 MyNamespacevector 的其他可能定义:

// x.h
#ifndef X_H
#define X_H

#include <vector>

namespace MyProject
{
    // With this everything compiles with no error!
    //using namespace std;

    // With this compilation breaks!
    using std::vector;
}

#endif

这是毫无戒心的 header 试图使用 base.h 中定义的 MyProject::vector:

// z.h
#ifndef Z_H
#define Z_H

#include "base.h"

namespace MyProject
{
    void useVector()
    {
        const vector v;
    }
}

#endif

最后是实现文件,包括 x.hz.h:

// main.cpp
// If I swap these two, program compiles!
#include "x.h"
#include "z.h"

int main()
{
    MyProject::useVector();
}

如果我在 x.h 中包含 using std::vector,则会发生实际的编译错误,告诉我在 z.h 中使用 vector 时必须指定模板参数,因为x.h 成功地隐藏了 MyProjectvector 的定义。这是为什么 using 声明不应在 header 文件中使用的一个很好的例子,或者事情比这更深入,我错过了更多?

但是,如果我在 x.h 中包含 using namespace std,则不会出现阴影,并且程序编译正常。这是为什么? using namespace std 不应该加载 std 下可见的所有名称,包括 vector,从而隐藏另一个名称吗?

If I include using namespace std in x.h, however, the shadowing doesn't occur, and the program compiles just fine. Why is that?

7.3.4/2-3的回答就这么多:

第一个

A using-directive specifies that the names in the nominated namespace can be used in the scope in which the using-directive appears after the using-directive.

接着跟进:

A using-directive does not add any members to the declarative region in which it appears.

所以 using-directive (using namespace) 只会使名称在目标命名空间中可用,不会使它们成为目标命名空间的成员。因此,任何现有成员都将优先于使用的命名空间成员。