Definizione di una classe all'interno di uno spazio dei nomi
-
05-07-2019 - |
Domanda
Esiste un modo più conciso per definire una classe in uno spazio dei nomi rispetto a questo:
namespace ns { class A {}; }
Speravo che qualcosa come class ns :: A {};
avrebbe funzionato, ma purtroppo no.
Soluzione
Sei vicino, puoi inoltrare la classe nello spazio dei nomi e poi definirla all'esterno se vuoi:
namespace ns {
class A; // just tell the compiler to expect a class def
}
class ns::A {
// define here
};
Quello che non puoi fare è definire la classe nello spazio dei nomi senza membri e quindi definire nuovamente la classe fuori dallo spazio dei nomi. Ciò viola la regola della definizione unica (o qualche assurdità).
Altri suggerimenti
Puoi farlo, ma non è davvero più succint.
namespace ns {
class A;
}
class ns::A {
};
o
namespace ns {
class B;
}
using ns::B;
class B {
};
La sezione che dovresti leggere è questa:
7.3.1.2 Definizioni dei membri dello spazio dei nomi
3 Ogni nome dichiarato per la prima volta in uno spazio dei nomi è un membro di quello spazio dei nomi. [...]
Nota il termine - dichiarazione in modo che D.Shawley (e il suo esempio) sia corretto.
No, non puoi. Per citare lo standard C ++, sezione 3.3.5:
Un nome dichiarato al di fuori di tutti i nomi o spazi dei nomi senza nome (7.3), blocchi (6.3), divertimento (8.3.5), funzione definizioni (8.4) e classi (clausola 9) ha l'ambito dello spazio dei nomi globale
Quindi la dichiarazione deve essere all'interno di un blocco dello spazio dei nomi - la definizione può ovviamente essere al di fuori di essa.