Dlaczego nie możemy zadeklarować przestrzeni nazw w klasie?
Deklarowanie klasy w klasie jest ważne. (Klasy zagnieżdżone)
Deklarowanie przestrzeni nazw w klasie jest nieprawidłowe.
Pytanie brzmi: czy istnieje jakiś dobry powód (poza problemami gramatycznymi / składniowymi c ++), aby zabronić deklarowania przestrzeni nazw w klasie?
Jeśli chodzi o to, dlaczego chciałbym to zrobić, oto przykład:
Miejmy podstawową delarację binarnego kontenera drzewa
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;
};
Teraz zauważam, że w mojej klasie jest wiele iteratorów, więc chciałbym je przegrupować w tej samej przestrzeni nazw, jak ta:
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;
};
Pozwoliłoby to na proste użycie:
void function()
{
binary_tree::iterator::left_depth it;
...stuff...
}
Działa to, gdy używam klasy zamiast przestrzeni nazw, ale wtedy zmuszony jestem zadeklarować klasę, która nigdy nie zostanie utworzona, co jest dość przestrzenią nazw.
Po co zezwalać na zagnieżdżone klasy i zabraniać zagnieżdżonych przestrzeni nazw w obrębie klas? czy jest to ciężar spuścizny?
Odpowiedzi z semantycznymi powodami, które nie tylko cytują część standardu (szczególnie części składniowe) zostaną docenione :)