2010-03-19 10 views
15

Se sono presenti operatori ostream sovraccaricati, definiti per oggetti locali della libreria, è corretto per loro andare nello spazio dei nomi std? Se non li dichiaro nello spazio dei nomi std, allora devo usare using ns:: operator <<.Su quale spazio dei nomi viene utilizzato l'operatore << (stream)?

Come possibile domanda di follow-up, ci sono operatori che dovrebbero passare allo spazio dei nomi standard o globale?

risposta

24

In base a Koenig Lookup (C++ Standard 3.4.2) operator<< verrà cercato nei namespace degli argomenti. Non è necessario dichiararlo nello spazio dei nomi std.

+0

così, se ho oggetto/classe da libreria C esterna nello spazio dei nomi globale, dovrei dichiarare gli operatori anche nello spazio dei nomi globale? – Anycorn

+0

Penso che sia una buona idea dichiarare operatori nel namespace da cui proviene l'argomento. –

2

Generalmente è una cattiva pratica dichiarare qualsiasi cosa (tipi, operatori, ecc.) Come parte di uno spazio dei nomi che non si possiede. Questo può avere conseguenze inaspettate per le persone che consumano la tua biblioteca. Una soluzione migliore è definire il proprio spazio dei nomi e importare sia std sia lo spazio dei nomi quando è necessario combinare le soluzioni.

7

Lo standard C++ vieta espressamente di dichiarare i propri costrutti nello spazio dei nomi std.

+1

std :: swap è un'eccezione notevole. Sei specificamente autorizzato a fornire la specializzazione template di std :: swap, che deve risiedere nello spazio dei nomi std –

+5

'std :: swap' non fa eccezione. È possibile fornire specializzazioni per qualsiasi modello di libreria standard. –

21

operator<<(..., MyClass) dovrebbe andare nello stesso spazio dei nomi di MyClass. Dovresti pensarlo come parte dell'interfaccia di MyClass, anche se capita di essere (necessariamente) una funzione non membro.

Un paio di riferimenti:

+0

L'eccezione alla regola di mettere tutte le cose correlate in un namespace sono le specializzazioni parziali relative a MyClass, ad es. Per std :: hash, std :: less, std :: swap, ecc. Che vanno in :: std ::. – metal