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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top