使用“using”指令缩短函数定义

时间:2013-09-01 08:44:12

标签: c++ namespaces

我偶然发现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警告之外,是否存在特定于此方案的任何陷阱?

2 个答案:

答案 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() {
    // ...
}