Wydaje mi się, że używanie niezasilanych przestrzeni nazw po prostu wymaga kłopotów, gdy ktoś wprowadzi nowy obszar nazw, który ma tę samą nazwę co przestrzeń nazw poziomu głównego i w tajemniczy sposób zmienia znaczenie wielu programów. Dlaczego ludzie zawsze mówią: std::
zamiast ::std::
. Czy naprawdę chcą powiedzieć: "Chcę użyć wszystkiego, co jest przydatne pod std
, a nie root".Dlaczego wszyscy używają niezatwierdzonych deklaracji przestrzeni nazw (np. Std :: not :: std: :)?
Oto przykład tego, co mam na myśli:
W fred/Foo.h:
#include <string>
namespace fred {
class Foo {
public:
void aPublicMember(const std::string &s);
};
} // end namespace fred
W fred/Bar.h:
namespace fred {
namespace std { // A standard fred component
class string { // Something rather unlike the ::std::string
// ...
};
} // namespace std
class Bar {
public:
void aPublicMember(std::string &s);
};
} // namespace fred
W oops.cpp:
#include <string>
#include "fred/Bar.h"
#include "fred/Foo.h" // Oops, the meaning of Foo is now different.
Czy tego chcą ludzie? Brakuje mi czegoś?
A może mówisz, że nigdy nie powinieneś nazwać przestrzeni nazw std
. A to wszystko dobrze i dobrze, ale co z inną przestrzenią nazw poziomu root? Czy jakikolwiek obszar nazw poziomu root, który kiedykolwiek zdefiniowałby gdziekolwiek, zawsze będzie niedostępny dla nazwy podprzestrzeni?
Aby wyjaśnić, nie będę rozważać żadnej odpowiedzi, która mówi mi, że std
jest wyjątkowy, ponieważ po prostu użyłem go jako przykładu. Mówię o ogólnym problemie i używam go jako rekwizytów do zilustrowania go, chociaż przyznaję, że to dość zaskakująca podpórka.
Mam zamiar zaakceptować to, ponieważ jest najbliżej prawdziwej odpowiedzi. Myślę, że ten drugi został właśnie wybrany wyżej, ponieważ był zabawniejszy. :-) Podejrzewam, że powinienem był wybrać inny przykład lub nie zadać tego pytania tak, jak ja to zrobiłem. – Omnifarious