命名空间内的类定义

Posted

技术标签:

【中文标题】命名空间内的类定义【英文标题】:Class definition inside namespace 【发布时间】:2014-01-17 15:07:15 【问题描述】:

我有一个这样的类声明:

// bar.h
namespace foo 
    class bar 
        // members both public and private
    

当我定义类时,我想这样做

// bar.cpp
namespace foo::bar 
    // member definitions

而不是

namespace foo 
    bar::x() 
    bar::y() 
    bar::z() 

但我不能。为什么是这样?我认为类声明了命名空间,但我一定是错的。作用域运算符不应该先解析命名空间作用域,然后再解析类作用域吗?

我问是因为任何时候你有一个非平凡长度的类名,重新输入类名可能会变得非常重复,特别是如果它有多个成员。可能是这样让人定义小类接口的吧。

【问题讨论】:

您在 bar 定义中缺少结束 ; 【参考方案1】:

这是为什么?我以为类声明了命名空间,但我一定是错的

你错了。 :)

作用域运算符不应该先解析命名空间作用域,然后再解析类作用域吗?

语言支持这一点并非不可能,但它根本不支持。

可能是因为它可能会有点令人困惑,并且因为以下内容完全是谎言:

class bar 
    void x();
    void y();
    void z();
;

namespace bar 
    void x() 
    void y() 
    void z() 

真的,类似于这种你可以用命名空间做的“内联定义”,就是成员函数的内联定义:

class bar 
   void x() 
   void y() 
   void z() 
;

【讨论】:

【参考方案2】:

首先,你的类声明后面需要一个;

namespace foo 

    class bar 
    
        // members both public and private
    ; // error without this

在实现类(非内联)时,可以通过两种方式实现:

void foo::bar::x() 

    // function definition

namespace foo

    void bar::x()
    
        // function definition
    

注意bar 是一个类,不是一个命名空间。

【讨论】:

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

不同命名空间内的类的循环依赖 C++

实际场景中的代表:在命名空间范围内的类范围内

获取命名空间内的所有类[重复]

如何使用命名空间内单独标头中定义的类

命名空间内的局部函数声明

在 Javascript 中定义一个具有命名空间的类