一个类名可以用作命名空间吗?

13

我记得有人告诉我C++类有自己的命名空间,而且可以使用类名作为范围解析操作的命名空间,像这样:

// Example.h
class Example {
    void Private();
public:
    void Public();
}

后来以类似这样的方式:

// Example.cpp
#include "Example.h"
using /*namespace*/ Example;
void Private() {}
void Public() {}

而不是:

// Example.cpp
#include "Example.h"
void Example::Private() {}
void Example::Public() {}

但我在我的书中既找不到解释也找不到例子。简短的谷歌搜索也没有结果。这是真的吗?


相关QA提供了替代方案:https://stackoverflow.com/questions/58553964/using-declaration-cannot-refer-to-class-member - Gabriel Devillers
2个回答

15

不,命名空间和类是不同的。

然而,命名空间和类都引入了一个可以使用作用域解析运算符::引用的作用域

using namespace N;声明仅适用于命名空间。无法为类执行类似的操作。using Example::x;只能针对Example内的特定名称x进行导入。

在提供成员函数体外部定义时,必须编写Example::Private(),没有其他选择。


-1

是的,每个类都有自己的命名空间,所有类声明的部分都属于该命名空间。

您可以使用using指令,如此处所述。

需要注意的是,您不能声明与类同名的命名空间,如下所示:

namespace fubar
{
    class snafu
    {
        ...
    };
}
// Cannot do stuff below (ERROR)
namespace fubar::snafu;
{
    // this is not valid, once a class always a class
    // once a namespace, always a namespace
    // a class makes a namespace also but never JUST a namespace
}

不过要小心,过度使用“using”可能会对您和继承您代码的人造成真正的麻烦。


1
我担心你没有理解我的意思,尽管有例子。这里没有一个例子/解释描述了我提到的用法。如果您能提供一个例子证明我错了,我会很感激。 - Stefan Stanković

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接