命名空间内的类定义

Class definition inside namespace

本文关键字:定义 命名空间      更新时间:2023-10-16

我有一个这样的类声明:

// 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() {}
}

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

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

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

你错了。:)

作用域

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

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

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

class bar {
    void x();
    void y();
    void z();
};
namespace bar {
    void x() {}
    void y() {}
    void z() {}
}

实际上,与可以使用命名空间执行的这种"内联定义"的类比是成员函数的内联定义:

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

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

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是一个类,而不是一个命名空间。