在命名空间中定义类

时间:2009-03-08 17:03:18

标签: c++ class syntax namespaces definition

是否有一种更简洁的方法来定义命名空间中的类而不是:

namespace ns { class A {}; }

我希望像class ns::A {};这样的东西可行,但不是。

4 个答案:

答案 0 :(得分:35)

您已经关闭了,您可以在命名空间中转发声明该类,然后根据需要在外部定义:

namespace ns {
    class A; // just tell the compiler to expect a class def
}

class ns::A {
    // define here
};

您不能做的是在没有成员的命名空间中定义类,然后在命名空间之外再次定义类。这违反了一个定义规则(或某些废话)。

答案 1 :(得分:7)

你可以这样做,但它并不是更简洁。

namespace ns {
    class A;
}

class ns::A {
};

或者

namespace ns {
    class B;
}

using ns::B;
class B {
};

答案 2 :(得分:2)

你应该阅读的部分是:

  

7.3.1.2命名空间成员定义

     

3在名称空间中首先声明的每个名称都是该名称空间的成员。[...]

注意术语 - 声明,所以D.Shawley(和他的例子)是正确的。

答案 3 :(得分:0)

不,你不能。引用C ++标准,第3.3.5节:

  

在所有名称或名称之外声明的名称   未命名的命名空间(7.3),块   (6.3),有趣(8.3.5),功能   定义(8.4)和类(条款   9)具有全局命名空间范围

因此声明必须在命名空间块内 - 定义当然可以在它之外。