Mi sembra che l'utilizzo di spazi dei nomi non aggiornati stia semplicemente creando problemi in seguito quando qualcuno inserisce un nuovo spazio dei nomi che ha lo stesso nome di uno spazio dei nomi di livello radice e altera misteriosamente il significato di molti programmi. Quindi, perché la gente dice sempre std::
anziché ::std::
. Hanno davvero intenzione di dire "Voglio usare qualsiasi cosa std
è utile, non quella di root".?Perché tutti usano dichiarazioni di namespace non aggiornate (ad es. Std :: not :: std: :)?
Ecco un esempio di ciò che intendo:
In fred/foo.h:
#include <string>
namespace fred {
class Foo {
public:
void aPublicMember(const std::string &s);
};
} // end namespace fred
In 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
In oops.cpp:
#include <string>
#include "fred/Bar.h"
#include "fred/Foo.h" // Oops, the meaning of Foo is now different.
È quello che le persone vogliono o sono Mi manca qualcosa?
E forse dici che non dovresti nominare mai uno spazio nomi std
. E va tutto bene, ma per quanto riguarda un altro spazio dei nomi di root? Qualunque spazio dei nomi di livello radice che qualcuno abbia mai definito è sempre off-limits per un nome di spazio secondario?
Per chiarire, non considererò alcuna risposta che mi dica che std
è speciale perché l'ho usato solo come esempio. Sto parlando di un problema generale e sto usando std
come supporto per illustrarlo, anche se ammetto che è un oggetto piuttosto sorprendente.
Lo accetterò perché è il più vicino a una vera risposta. Penso che l'altro sia stato appena votato più in alto perché era più divertente. :-) Sospetto che avrei dovuto scegliere un esempio diverso, o non aver fatto la domanda nel modo in cui l'ho fatto. – Omnifarious