2009-03-08 18 views

risposta

32

sei vicino, è possibile inoltrare dichiarare la classe nello spazio dei nomi e quindi definire al di fuori, se si desidera:

namespace ns { 
    class A; // just tell the compiler to expect a class def 
} 

class ns::A { 
    // define here 
}; 

Quello che non si può fare è definire la classe nello spazio dei nomi, senza i membri e quindi definire la classe di nuovo al di fuori del namespace. Ciò viola la One Definition Rule (o somesuch nonsense).

+0

grazie. non è più succinto, ma sembra avere senso. –

+1

Non penso che esista una versione più succinta o leggibile di 'namespace ns {class A {}; } 'ma probabilmente è solo un'opinione personale. –

+0

Questa è la separazione tra dichiarazione e definizione. – Shaowu

0

No, non è possibile. Per citare lo standard C++, sezione 3.3.5:

Un nome dichiarato di fuori di ogni chiamata o namespace senza nome (7.3), blocchi (6.3), divertimento (8.3.5), la funzione definizioni (8.4) e le classi (clausola 9) ha portata namespace globale

Quindi la dichiarazione deve essere all'interno di un blocco di spazio dei nomi - la definizione può naturalmente essere al di fuori di esso.

+0

bene, class A {}; è una definizione, non una dichiarazione. Sei sicuro che la citazione sia applicabile, quindi? Le definizioni –

+0

sono dichiarazioni –

+0

che non era ben pensata - ma sono sicuro che la citazione si applica - darò un'altra occhiata. –

2

La sezione si dovrebbe essere la lettura è questa:

7.3.1.2 definizioni di membri dello spazio dei nomi

3 Ogni nome dichiarata in uno spazio dei nomi è un membro di tale spazio dei nomi [.... ]

Prendere nota del termine - dichiarazione in modo che D.Shawley (e il suo esempio) sia corretto.

7

È possibile farlo, ma non è davvero più un successo.

namespace ns { 
    class A; 
} 

class ns::A { 
}; 

O

namespace ns { 
    class B; 
} 

using ns::B; 
class B { 
}; 
Problemi correlati