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

Posted

技术标签:

【中文标题】类名可以用作命名空间吗?【英文标题】:Can a class name be used as a namespace? 【发布时间】:2016-03-02 20:46:15 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

不过,命名空间和类都引入了一个作用域,可以使用作用域解析运算符:: 来引用它。

using namespace N; 声明只能应用于命名空间。不可能为班级做类似的事情。只能对Example里面的特定名称xusing Example::x;,一一导入。

在提供外联成员函数体时,必须写Example::Private(),没有办法。

【讨论】:

【参考方案2】:

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

您可以按照here 的说明使用 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

不过要小心。 '使用'过多会对你和继承你的代码的人起到真正的作用。

【讨论】:

恐怕你还是不明白我的意思,尽管有例子。没有一个示例/解释here 描述了我提到的用法。随时用一个例子证明我错了,我将不胜感激。

以上是关于类名可以用作命名空间吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 唯一类名与命名空间

从 C# 2.0 中的 dll 获取命名空间、类名

我无意中为命名空间和类名使用了相同的名称,并且需要重命名其中一个的所有实例

9.类名与命名空间

命名空间“System.Configuration”中不存在类型或命名空间名称“ConfigurationManager”

c#里一个文件夹下可以添加多个命名空间和类名相同的类么