2009-03-08 15 views

Respuesta

32

estás cerca, puede reenviar declarar la clase en el espacio de nombres y luego definir fuera si quieres:

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

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

Lo que no puede hacer es definir la clase en el espacio de nombres sin miembros y luego definir la clase otra vez fuera del espacio de nombres. Eso viola la regla de una sola definición (o algunas tonterías).

+0

gracias. eso no es más sucinto, pero parece tener sentido. –

+1

No creo que realmente exista una versión más sucinta o legible que 'namespace ns {class A {}; } 'pero probablemente sea solo una opinión personal. –

+0

Esa es la separación de declaración y definición. – Shaowu

0

No, no puedes. Para citar el estándar de C++, la sección 3.3.5:

Un nombre declarado fuera de toda llamada o espacios de nombres sin nombre (7.3), bloques (6.3), diversión (8.3.5), la función definiciones (8.4) y las clases (cláusula 9) tiene ámbito espacio de nombres global

Así que la declaración debe estar dentro de un bloque de espacio de nombres - la definición puede ser, por supuesto fuera de ella.

+0

así, clase A {}; es una definición, no una declaración. ¿Estás seguro de que la cita es aplicable, entonces? –

+0

las definiciones son declaraciones –

+0

um que no estaba bien pensado, pero estoy seguro de que se aplica la cita, volveré a mirar. –

2

La sección debe estar leyendo esto es:

7.3.1.2 definiciones de miembros Espacio de nombres

3 Cada nombre declarado por primera vez en un espacio de nombres es un miembro de ese espacio de nombres [.... ]

Tenga en cuenta el término - declaración por lo que D.Shawley (y su ejemplo) es correcto.

7

Puede hacerlo, pero en realidad no es más succint.

namespace ns { 
    class A; 
} 

class ns::A { 
}; 

O

namespace ns { 
    class B; 
} 

using ns::B; 
class B { 
}; 
Cuestiones relacionadas