Questo qualifica completamente il nome, in modo che solo il modello vector
in viene utilizzato lo spazio dei nomi std
nello spazio dei nomi globale. Fondamentalmente significa:
{global namespace}::std::vector<myclass> myvec;
Non ci può essere una differenza quando si hanno le entità con lo stesso nome in diversi spazi dei nomi. Per un semplice esempio di quando questo potrebbe importa, prendere in considerazione:
#include <vector>
namespace ns
{
namespace std
{
template <typename T> class vector { };
}
void f()
{
std::vector<int> v1; // refers to our vector defined above
::std::vector<int> v2; // refers to the vector in the Standard Library
}
};
Dal momento che non è permesso di definire le proprie entità nel std
spazio dei nomi, è garantito che ::std::vector
sarà sempre fare riferimento al contenitore di libreria standard. std::vector
potrebbe riferirsi a qualcos'altro. .
fonte
2011-02-07 19:15:38
Tuttavia, std :: vector farà riferimento a foo :: std :: vector solo se ce n'è uno. Altamente improbabile! Altrimenti troverà comunque :: std :: vector. –
@Bo: No. Ad esempio, nell'esempio che presentiamo di seguito, se si rimuoveva la definizione di 'ns :: std :: vector', la dichiarazione di' v1' in 'ns :: f()' fallirebbe. –
@James: OK, se effettivamente hai uno spazio dei nomi locale std senza un vettore, il compilatore ti dirà che è mancante. Questo non è un buon motivo per ** sempre ** usare :: di fronte a tutto. Se non si dispone di uno spazio dei nomi locale std, il normale std :: vector verrà comunque trovato, anche se ci si trova in un altro spazio dei nomi. –