2010-07-19 18 views
13

cuál fue mi sorpresa al saber que no podía declarar adelante una clase de otro alcance usando el operador de resolución de alcance, es decir,clases Adelante declaran en espacios de nombres

class someScope::someClass; 

En cambio, la declaración completa tiene que ser utilizado como sigue:

namespace 
{ 
    class someClass; 
} 

¿Alguien puede explicar por qué este es el caso?

ACTUALIZACIÓN: Para aclarar, estoy pidiendo qué este es el caso.

+0

Duplicado: http://stackoverflow.com/questions/1368642/is-there-a-shorter-way-to-forward-declare-a-class-in-a-namespace Respuesta técnica, a partir de esa pregunta : http://stackoverflow.com/questions/1368642/is-there-a-shorter-way-to-forward-declare-a-class-in-a-namespace/1368738#1368738 – GManNickG

Respuesta

6

parece como si la respuesta se encuentra en la especificación C++:

3.3.5 "ámbito espacio de nombres" en la norma.

Entidades declaradas en un espacio de nombres de cuerpo se dice que son miembros de la espacio de nombres, y los nombres introducidos por estas declaraciones en la región declarativa del espacio de nombres se dice que son nombres de los miembros de la espacio de nombres.

Un miembro de espacio de nombres puede ser también se refiere después de que el alcance operador :: resolución (5.1) aplicado a el nombre de su espacio de nombres o el nombre de un espacio de nombres que designa espacio de nombres del de miembro en un using- directiva;

1

No estoy seguro de por qué. Tal vez porque, en su primer fragmento de código, someScope no está declarado. Puede ser un espacio de nombre o un nombre de clase. Si someScope es un nombre de clase, no puede reenviar de forma independiente un miembro de clase de otra clase.

8

No puede declarar una clase fuera de su espacio de nombres, porque el compilador no pudo conocer el tipo de someScope.

espacio de nombres {} se requiere para declarar la existencia de espacio de nombres, y luego, declarar clase algunaClase en su ámbito de aplicación.

+0

No estás respondiendo mi pregunta, aunque , Estoy preguntando por qué no es así, cómo evitarlo, ya lo sé. :-) – Konrad

+1

En mi humilde opinión, esta decisión fue elegida para hacer una distinción entre someClass :: someMember y someNamespace :: someClass. ¿Cómo podría manejarlo de otra manera? – Doomsday

Cuestiones relacionadas