2010-10-22 24 views
6

quaternion.h: 15: error: campo 'v' tiene tipo incompletoError: El campo tiene un tipo incompleto

¡Hola! Estoy atrapado en un error que parece que no puedo resolver.

A continuación es mi código:

#ifndef QUATERNION_H 
#define QUATERNION_H 

#include "vec3.h" 

class Vec3; 

class Quaternion 
{ 

public: 

Quaternion(Vec3 v); 

Quaternion(double w, Vec3 v); 

Vec3 v; <--------------------------This is where the error is :(

double scalar; 



Quaternion operator *(Quaternion s); 

Quaternion conjugate(); 

}; 



#endif 

Mi Vec.h se parece a esto:

#ifndef VEC3_H 

#define VEC3_H 



#include "point.h" 

#include "quaternion.h" 

#include <math.h> 

class Quaternion; 


class Vec3 

{ 

friend ofstream& operator <<(ofstream& output, const Vec3& p); 

friend ifstream& operator >>(ifstream& input, Vec3& p); 



public: 

Vec3(); 

Vec3(double _x, double _y); 

Vec3(double _x, double _y, double _z); 



double x,y,z; 



//Operators 

Vec3 operator -(Vec3 a) const; 

Vec3 operator /(double s) const; 

Vec3 operator *(double s) const; 

Vec3 operator *(Quaternion q) const; 



// Used to do vector Vec3 addition 

Vec3 operator +(Vec3 a) const; 

Point operator +(Point a) const; 



Vec3& operator =(Point a); 



Vec3 crossProduct(Vec3 v1); // Itself cross v1 

double dotProduct(Vec3 v); 

double length(); 

void normalize(); 


}; 



#endif 

Gracias por la ayuda de nuevo =)

+0

circluar dependancy? –

Respuesta

10

Bueno, tiene la inclusión circular de dos archivos de encabezado: vec3.h y quaternion.h. Incluir guardias se asegurará de que cada encabezado se incluya solo una vez. Uno de ellos se incluirá primero, el otro - segundo. En su caso, quaternion.h se incluye primero, lo que significa que Vec3 se convierte en un tipo incompleto. Esto es lo que el compilador te está diciendo.

Como está intentando utilizar el objeto Vec3 como miembro inmediato del objeto Quaternion, absolutamente necesita que Vec3 sea un tipo completo. El encabezado quaternion.h debe incluir el encabezado vec3.h. La declaración

class Vec3; 

logra absolutamente nada en quaternion.h, por lo que sólo puede eliminarlo.

Dado lo anterior, se deduce que no puede vec3.h incluyen quaternion.h, o que va a terminar con la inclusión circular, que nunca se logra nada. Elimine la inclusión de quaternion.h de vec3.h.Mantener la declaración

class Quaternion; 

en vec3.h y ver si funciona de esa manera.

0

el problema es que sus archivos están incluye entre ellos donde no hay dependencia circular. vec3 no debería incluir quaternion, entonces todo estará bien.

ahora el error del compilador dio es porque predeclared vec3 pero la definición completa no se lee si se incluye vec3:

vecr3.h -> incluyen cuaternión
quaternion.h -> vec3 incluyen, pero incluyen guardias que no ocurra nada
quaternion.h -> predeclarar vec3,
quaternion.h -> intentar utilizar vec3 // fallar
vec3.h -> realidad declarar vec3

el único el orden correcto es primero incluir vec3 y solo ENTONCES th e quaternion incluyen.

3

El problema es la inclusión mutua del .h. El compilador conoce los tipos, pero en algún punto están incompletos. Mi consejo sería simplemente reenviar declarar Quarternion en el archivo vec3.h, pero NO incluir quaternion.h.

Luego, quaternion.h puede incluir vec3.h y todo se compilará. Además, como sugirió JaredPar, elimine la declaración directa de Vec3 en quaternion.h.

Cuestiones relacionadas