【问题标题】: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 定义中缺少结束 ;

标签: c++ class namespaces


【解决方案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 是一个类,不是一个命名空间。

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 2020-02-19
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 2021-12-29
      • 2021-12-23
      • 1970-01-01
      • 2010-11-21
      相关资源
      最近更新 更多