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

Example of error caused by using directive in namespaces

提问人:swahnee 提问时间:10/1/2016 最后编辑:Communityswahnee 更新时间:10/3/2016 访问量:241

问:

我正在尝试了解在命名空间中包含声明可能会导致什么样的错误。我正在考虑这些链接using

我正在尝试创建一个示例,其中由于使用了声明,由于使用了声明,一个名称被静默地替换为在另一个头文件之前加载的头文件而导致错误。using

在这里我定义:MyProject::vector

// base.h
#ifndef BASE_H
#define BASE_H

namespace MyProject
{
    class vector {};
}

#endif

这是“坏”标题:在这里,我试图欺骗内部的其他可能定义:usingvectorMyNamespace

// 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

这是尝试使用的毫无戒心的标头,如中定义:MyProject::vectorbase.h

// 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();
}

如果我包括 in ,就会发生实际的编译错误,告诉我在使用 in 时必须指定一个模板参数,因为成功地掩盖了 inside 的定义。这是一个很好的例子,说明为什么不应该在头文件中使用声明,或者事情比这更深入,而我错过了更多?using std::vectorx.hvectorz.hx.hvectorMyProjectusing

但是,如果我包括 ,则不会发生阴影,并且程序编译得很好。为什么?不应该加载所有可见的名称,包括 ,从而遮蔽另一个?using namespace stdx.husing namespace stdstdvector

C++ Compiler-Errors 命名空间 using-directives using-declaration

评论


答:

1赞 Mark B 10/3/2016 #1

但是,如果我在 x.h 中包含使用命名空间 std,则阴影 不会发生,并且程序编译得很好。为什么?

我可以从 7.3.4/2-3 中回答这么多:

第一

using 指令指定指定命名空间中的名称 可以在 using 指令出现在 之后的作用域中使用 using 指令。

然后跟进:

using 指令不会向声明性区域添加任何成员 它出现在其中。

因此,using 指令 () 仅使名称可从目标命名空间中使用,而不会使它们成为目标命名空间的成员。因此,任何现有成员都将优先于使用的命名空间成员。using namespace

评论

0赞 swahnee 10/4/2016
谢谢!我不知道 的两种用法之间的区别。using