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

Can a class name be used as a namespace?

提问人:Stefan Stanković 提问时间:11/29/2015 最后编辑:Stefan Stanković 更新时间:11/29/2015 访问量:13101

问:

我记得有人告诉我,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() {}

但我在我的书中既找不到解释,也找不到例子。简短的谷歌搜索也是一条死胡同。这是真的吗?

C++ 作用域 命名空间 头文件

评论

0赞 Gabriel Devillers 5/11/2023
相关 QA 给出替代方案:stackoverflow.com/questions/58553964/...

答:

-1赞 Ken Clement 11/29/2015 #1

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

您可以按照此处的说明使用指令。

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

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
}

不过要小心。“使用”太多会对你和那些继承你代码的人造成真正的把戏。

评论

1赞 Stefan Stanković 11/29/2015
尽管有这些例子,恐怕你不理解我。这里没有一个例子/解释来描述我提到的用法。请随时用一个例子证明我错了,我将不胜感激。
15赞 M.M 11/29/2015 #2

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

但是,命名空间和类都引入了一个范围,可以使用范围解析运算符来引用该范围::

该声明只能应用于命名空间。不可能为一个类做类似的事情。您只能对里面的特定名称进行逐个导入。using namespace N;using Example::x;xExample

在提供成员函数体外行时,必须写成,没有别的选择。Example::Private()