2012-07-02 26 views
6

estaba compilando el código siguiente:tipo incompleto nombrado en nombre anidado especificador

class B; 

class A { 
    A(); 
    friend A B::newAObject(); 
}; 

class B { 
    friend A::A(); 
public: 
    A newAObject(); 
}; 

Esto puede parecer extraño, pero la idea era tener una clase A que sólo podía ser producida por un objeto de tipo B (quien probablemente sería un singleton).

El problema es que he creado una dependencia circular entre estos objetos. A se debe definir antes de B, y B se debe definir antes de A. Aparentemente hacia adelante declarando B no es lo suficientemente bueno, B debe estar completamente definido antes de A (y viceversa).

¿Cómo puedo evitar esto?

Editar: el error real es: Incompleto tipo 'B' nombrado en especificador de nombre anidado.

Nota: hay otra publicación que es similar a esta aquí: Error: incomplete type used in nested name specifier, pero está muy templada y eso me confundía, de ahí esta publicación.

+1

Es un poco extraño hacer que un solo método sea un amigo. ¿Estás seguro de que no quieres hacer de toda la clase un amigo? –

+0

No sabía que eso fuera posible. ¿Cómo se hace? ¿acabo de escribir 'friend class B' dentro de' A' y 'friend class A' dentro de' B'? – anthropomorphic

+1

Eso es correcto ... –

Respuesta

5

C++ 2003 establece que cuando se accede al contenido de la clase, esta clase debe estar completamente definida. La declaración forward no es suficiente. Esto significa que las dependencias circulares como la suya simplemente no están permitidas.

p.s. Declarar a toda la clase como un amigo debería funcionar, si esto es todo lo que necesitas.

Por cierto, la especificación amigo genera declaración adelante para la clase, mira el siguiente código:

void F10(C1 &p1); 

class C2 
{ 
    friend class C1; 
}; 

void F11(C1 **p1); 

compilador dará error de sintaxis para F10 porque C1 no está definido, pero F11 compilará bien a causa de la amigo espec. Esto puede sonar extraño, pero esto se define en el estándar y los compiladores siguen esto.

+0

Declarar ambas clases como amigos del otro funcionó para mí. Gracias. – anthropomorphic

Cuestiones relacionadas