2009-08-23 12 views
5

lo que realmente necesita tres estados, es decir, como esteForward-declarando puntero plantilla

class A; 
template<class _T> class B; 
typedef B<A> C; 

para reenviar-declarar un puntero de la plantilla de tipo C, así:

C* c = 0; 

Tenía la esperanza de ser capaz de ocultar las clases A y B en mi forward-declaration, ¿eso es posible?

+0

Y el método de 2 líneas de litb es un poco menos directo. – rlbond

+0

@rlbond, se trasladó a una respuesta y elimina el miedo de 2 líneas de código –

Respuesta

8

Aunque no es exactamente el mismo, se puede hacer esto en su lugar:

class C; 
C* c = 0; 

y luego más tarde, en el archivo de implementación, después de que los archivos de cabecera para " a" y 'B' se han incluido, definir la 'C' de esta manera:

class C : public B<A> {}; 

de la herencia en lugar de un typedef debería funcionar si sólo se necesita utilizar el constructor por defecto de B <un>.

+0

EDITAR: No necesita reenviar declarar "A" y "B" en el archivo de implementación. Los archivos de encabezado deben estar incluidos. – Ropez

+0

No era lo que tenía en mente, sino una gran sugerencia. ¡Gracias! –

+0

Una solución muy útil e inteligente, gracias, @Ropez! – Steed

1

Realmente no entiendo su pregunta, pero el código de esta manera:

template<class _T> class B; 

es ilegal. C++ reserva nombres que comienzan con un guión bajo y una letra mayúscula para la implementación de la biblioteca del compilador &; no tiene permitido usarlos en su propio código.

+0

gracias esta ayuda para mí –

3

Sí, lo necesita. Tenga en cuenta que las tres líneas hacen cosas diferentes. El primero declara una clase. El segundo declara una plantilla, y el tercero declara un tipodef-name. Al declarar el typedef-name, puede usar un especificador de tipo elaborado como "clase A" para nombrar la clase sin tener su nombre en el alcance (con algunas trampas desagradables incluidas), pero no puede colapsar la declaración de la plantilla con la declaración typedef.

No me preocuparía las tres líneas. Si es necesario, me acaba de escribir ellos hacia fuera :)

+0

Había esperado que, ya que sólo lo uso para un puntero privado, habría una buena manera única reserva el espacio necesario sin tener que revelar los detalles subyacentes. –

+0

¿Qué quieres decir? ¿Puede escribir el código en la pregunta sobre cómo debería verse y cómo se ve ahora? Creo que podemos entenderlo mejor –

Cuestiones relacionadas