我偶然发现using namespace
指令的使用不寻常:
给定头文件WeirdNamespace.h
:
namespace WeirdNamespace
{
class WeirdClass
{
public:
int x;
void go();
};
}
我有一个匹配的'WeirdNamespace.cpp`:
#include "WeirdNamespace.h"
#include <iostream>
using namespace WeirdNamespace;
void WeirdClass::go()
{
std::cout << "Reached go?!" << std::endl;
}
该类使用如下:
#include "WeirdNamespace.h"
int main(int argc, const char * argv[])
{
WeirdNamespace::WeirdClass c;
c.go();
}
到目前为止,我从未见过用于避免在cpp文件中重新打开命名空间或使用命名空间名称为方法名称添加前缀的using指令。这是指令的正确用法吗?除了通常的using namespace
警告之外,是否存在特定于此方案的任何陷阱?
答案 0 :(得分:2)
您可以这样做:
namespace WN = WeirdNamespace;
WN::WeirdClass c;
现在,我有了问题!以上是没有答案的。
引自[7.3.4]使用指令
“在非限定名称查找(3.4.1)期间,名称显示为它们 在包含两者的最近的封闭命名空间中声明 using-directive和指定的命名空间。“
因此,你在源代码中的定义没有将它包含在命名空间中就可以了。
答案 1 :(得分:0)
是的,它有效,但有一个陷阱:
using namespace NamespaceName
将提供NamespaceName
中的所有姓名。
因此,您可以使用using
仅使用类名:
#include <iostream>
#include "WeirdNamespace.h"
using WeiredNamespace::WeiredClass;
void WeiredClass::go() {
// ...
}