是否有一种更简洁的方法来定义命名空间中的类而不是:
namespace ns { class A {}; }
我希望像class ns::A {};
这样的东西可行,但不是。
答案 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)具有全局命名空间范围
因此声明必须在命名空间块内 - 定义当然可以在它之外。