提问人:swahnee 提问时间:10/1/2016 最后编辑:Communityswahnee 更新时间:10/3/2016 访问量:241
在命名空间中使用指令导致的错误示例
Example of error caused by using directive in namespaces
问:
我正在尝试了解在命名空间中包含声明可能会导致什么样的错误。我正在考虑这些链接。using
我正在尝试创建一个示例,其中由于使用了声明,由于使用了声明,一个名称被静默地替换为在另一个头文件之前加载的头文件而导致错误。using
在这里我定义:MyProject::vector
// base.h
#ifndef BASE_H
#define BASE_H
namespace MyProject
{
class vector {};
}
#endif
这是“坏”标题:在这里,我试图欺骗内部的其他可能定义:using
vector
MyNamespace
// 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::vector
base.h
// z.h
#ifndef Z_H
#define Z_H
#include "base.h"
namespace MyProject
{
void useVector()
{
const vector v;
}
}
#endif
最后是实现文件,包括 和 :x.h
z.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::vector
x.h
vector
z.h
x.h
vector
MyProject
using
但是,如果我包括 ,则不会发生阴影,并且程序编译得很好。为什么?不应该加载所有可见的名称,包括 ,从而遮蔽另一个?using namespace std
x.h
using namespace std
std
vector
答:
但是,如果我在 x.h 中包含使用命名空间 std,则阴影 不会发生,并且程序编译得很好。为什么?
我可以从 7.3.4/2-3 中回答这么多:
第一
using 指令指定指定命名空间中的名称 可以在 using 指令出现在 之后的作用域中使用 using 指令。
然后跟进:
using 指令不会向声明性区域添加任何成员 它出现在其中。
因此,using 指令 () 仅使名称可从目标命名空间中使用,而不会使它们成为目标命名空间的成员。因此,任何现有成员都将优先于使用的命名空间成员。using namespace
评论
using
下一个:包含和使用声明
评论