2010-07-19 9 views
13

Sono rimasto piuttosto sorpreso di apprendere che non ho potuto l'ora dichiarare una classe da un altro ambito utilizzando l'operatore di risoluzione dell'ambito, cioèclassi di andata dichiara in namespace

class someScope::someClass; 

invece, la dichiarazione completa deve essere utilizzato come segue:

namespace 
{ 
    class someClass; 
} 

Qualcuno può spiegare perché questo è il caso?

AGGIORNAMENTO: Per chiarire, io sto chiedendo perché questo è il caso.

+0

Duplicate: http://stackoverflow.com/questions/1368642/is-there-a-shorter-way-to-forward-declare-a-class-in-a-namespace risposta tecnica, da quella domanda : http://stackoverflow.com/questions/1368642/is-there-a-shorter-way-to-forward-declare-a-class-in-a-namespace/1368738#1368738 – GManNickG

risposta

6

sembra che la risposta sta nella specifica C++:

3.3.5 "scope Namespace" nella norma.

Enti dichiarati in un namespace-corpo sono detto di essere membri del spazio dei nomi e nomi introdotte da queste dichiarazioni nella regione dichiarativa dello spazio dei nomi si dice che sono i nomi dei membri del namespace.

Un membro dello spazio dei nomi può anche essere di cui dopo il :: ambito operatore di risoluzione (5.1) applicato al il nome del suo spazio dei nomi o il nome di un namespace che nomina dello spazio dei nomi del membro in un using- direttiva;

1

Non so perché. Forse perché, nel tuo primo snippet di codice, someScope non è dichiarato. Può essere un namespace o un nome di classe. Se someScope è un nome di classe, non è possibile inoltrare autonomamente dichiarare un membro di classe di un'altra classe.

8

Non è possibile dichiarare una classe al di fuori del suo spazio dei nomi, poiché il compilatore non può essere a conoscenza del tipo di someScope.

namespace {} è tenuto a dichiarare l'esistenza di spazio dei nomi, e poi, dichiarare classe someClass nel vostro campo di applicazione.

+0

Tuttavia non stai rispondendo alla mia domanda , Sto chiedendo perché questo non è il caso di aggirarlo - lo so già. :-) – Konrad

+1

IMHO, questa decisione è stata scelta per fare una distinzione tra someClass :: someMember e someNamespace :: someClass. Come potrebbe altrimenti gestirlo? – Doomsday

Problemi correlati