在命名空间中使用指令导致的错误示例
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
隐藏 MyNamespace
中 vector
的其他可能定义:
// 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.h
和 z.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
成功地隐藏了 MyProject
中 vector
的定义。这是为什么 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
) 只会使名称在目标命名空间中可用,不会使它们成为目标命名空间的成员。因此,任何现有成员都将优先于使用的命名空间成员。
我试图了解在命名空间中包含 using
声明会引起什么样的错误。我正在考虑 these links.
我正在尝试创建一个示例,其中由于使用了 using
声明,导致错误的原因是一个名称被一个 header 文件悄悄替换,该文件先于另一个文件加载.
这里我定义MyProject::vector
:
// base.h
#ifndef BASE_H
#define BASE_H
namespace MyProject
{
class vector {};
}
#endif
这是 "bad" header:这里我试图欺骗 using
隐藏 MyNamespace
中 vector
的其他可能定义:
// 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.h
和 z.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
成功地隐藏了 MyProject
中 vector
的定义。这是为什么 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
) 只会使名称在目标命名空间中可用,不会使它们成为目标命名空间的成员。因此,任何现有成员都将优先于使用的命名空间成员。