2011-11-15 43 views
5

Así que estoy consiguiendo los errores siguientes:problemas de espacio de nombres

..\Actor.h:35: error: `Attack' is not a member of `RadiantFlux' 
..\Actor.h:35: error: template argument 1 is invalid 
..\Actor.h:35: error: template argument 2 is invalid 
..\Actor.h:35: error: ISO C++ forbids declaration of `attacks' with no type 

En esta línea (entre otros):

std::vector<RadiantFlux::Attack> attacks; 

Aquí están los ficheros relevantes:

Actor.h:

#ifndef ACTOR_H_ 
#define ACTOR_H_ 

#include <string> 
#include <vector> 
#include "Attack.h" 

namespace RadiantFlux { 

... 

class Actor { 
private: 
    std::string name; 
    int health; 
    std::vector<RadiantFlux::Attack> attacks; 
    Attributes attributes; 

public: 
    ... 
}; 

} 

#endif /* ACTOR_H_ */ 

Attack.h:

#ifndef ATTACK_H_ 
#define ATTACK_H_ 

#include <string> 
#include <stdlib.h> 
#include <time.h> 
#include "Actor.h" 

namespace RadiantFlux { 

... 

class Attack { 
private: 
    ... 

public: 
    ... 
}; 

} 

#endif /* ATTACK_H_ */ 

¿Por qué recibo estos errores y qué puedo hacer para solucionarlos? Supongo que tiene algo que ver con los espacios de nombres ...

Respuesta

12

Tiene una dependencia cíclica de los archivos de encabezado.
Attack.h incluye Actor.h y viceversa.
Utilice Forward Declaration de clase para evitar problemas de dependencia circular.


Dado que los comentarios de la OP, esto es lo que hay que hacer:

class Actor; 

class Attack 
{ 

}; 

Si el código de falla al compilar después de hacer esto, es necesario para leer la respuesta vinculado y Entender por qué el error y cómo resolverlo. La respuesta vinculada lo explica todo.

+0

Si hago esto me da un error:" .. \ Actor.h: 26: error: declaración adelantada de' struct RadiantFlux :: Ataque '" – cactusbin

+0

No creo que un parámetro de plantilla pueda ser una declaración directa, ¿o sí? Creo que el Actor debería ser declarado en ataque en su lugar. Pero, en verdad, creo que probablemente haya una forma diferente de diseñar para que las dependencias sean lineales en vez de cíclicas. – Kevin

+0

@cactusbin: Necesita reenviar-declarar 'Actor' para' Ataque', no viceversa (¿por qué necesita esta dependencia, de todos modos?). –

0

Las clases Actor y Attack ambas se refieren entre sí, por lo que deberá agregar una declaración directa en uno de los archivos.

Por ejemplo, en Actor.h:

class Attack; 

class Actor 
{ 
    ... 
}; 
+2

No, usted no se puede reenviar declarar Ataque, porque 'std :: vector' no se puede crear una instancia con un tipo incompleto. –

Cuestiones relacionadas