【发布时间】:2012-11-09 04:19:42
【问题描述】:
在类中声明类是有效的。 (嵌套类)
在类中声明命名空间是无效的。
问题是:有什么好的理由(除了 c++ 语法/语法问题)禁止在类中声明命名空间吗?
至于我为什么要这样做,这里有一个例子:
让我们有一个二叉树容器的基本说明
template<typename Data>
class binary_tree
{
public:
... stuff ....
private:
... iterators class declaration ...
public:
typedef left_depth_iterator_impl left_depth_iterator;
typedef right_depth_iterator_impl right_depth_iterator;
typedef left_breadth_iterator_impl left_breadth_iterator;
typedef right_breadth_iterator_impl right_breadth_iterator;
... stuff ....
private:
Data data;
binary_tree* left;
binary_tree* right;
};
现在我注意到我的类中有很多迭代器,所以我想像这样在同一个命名空间中重新组合它们:
template<typename Data>
class binary_tree
{
public:
... stuff ....
private:
... iterators class declaration ...
public:
namespace iterator
{
typedef left_depth_iterator_impl left_depth;
typedef right_depth_iterator_impl right_depth;
typedef left_breadth_iterator_impl left_breadth;
typedef right_breadth_iterator_impl right_breadth;
}
... stuff ....
private:
Data data;
binary_tree* left;
binary_tree* right;
};
这将允许一个简单的用法:
void function()
{
binary_tree::iterator::left_depth it;
...stuff...
}
如果我使用一个类而不是命名空间,这会起作用,但是我不得不声明一个永远不会被实例化的类,它是一个相当命名空间。
为什么允许嵌套类并禁止在类中嵌套命名空间?这是遗留的负担吗?
不只引用部分标准(尤其是语法部分)的语义原因的答案将被欣赏:)
【问题讨论】:
-
请参阅 Eric Lippert 在stackoverflow.com/questions/8671427/… 上的回答 摘录:默认情况下未实现功能 缺少功能不需要理由。相反,所有功能都必须通过证明其收益大于成本来证明其合理性。作为提出该功能的人,您有责任描述为什么您认为该功能有价值;我没有责任解释为什么不这样做。
-
罗伯特链接的答案非常好,我希望我能再投票几次。
-
你可以这样做... #define inclass_namespace struct.. 你可以这样使用它...
-
在阅读了有关 Smalltalk 及其方法协议的信息后,我遇到了与 @drax 相同的问题,这些协议用于按目的对方法进行分组。参见The Art and Science of Smalltalk,第 66 页,第 2 章。 “标准协议”。协议的目的是帮助编写类和使用它的程序员。
-
我认为@RobertCooper 所说的可能是有效的,但也很有可能实际上提出了一个功能但由于某种原因被拒绝了。或者已经存在更好的选择。
标签: c++ class namespaces