2

我偶然发现了对我来说不寻常的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警告外,这种情况是否有任何特定的陷阱?

4

2 回答 2

3

你可能会这样做:

namespace WN = WeirdNamespace;
WN::WeirdClass c;

现在,我有问题了!以上是没有答案的

引用 [7.3.4] 使用指令

“在非限定名称查找 (3.4.1) 期间,名称看起来好像它们是在最近的封闭命名空间中声明的,其中包含使用指令和指定命名空间。”

因此,您在源代码中的定义而不将其包含在命名空间中是可以的。

于 2013-09-01T08:51:46.987 回答
0

是的,它是有效的,但有一个陷阱:

using namespace NamespaceName将提供NamespaceName.

因此,您可以using只使用类名:

#include <iostream>
#include "WeirdNamespace.h"

using WeiredNamespace::WeiredClass;

void WeiredClass::go() {
    // ...
}
于 2013-09-01T09:04:27.023 回答