Error: Field has an incomplete type

Aero picture Aero · Oct 22, 2010 · Viewed 27.9k times · Source

quaternion.h:15: error: field ‘v’ has incomplete type

Hi! I am stuck on an error that I cannot seem to solve.

Below is my code:

#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

My Vec.h looks like this:

#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

Thanks for the help again =)

Answer

AnT picture AnT · Oct 22, 2010

Well, you have circular inclusion of two header files: vec3.h and quaternion.h. Include guards will make sure that each header is included only once. One of them will be included first, the other - second. In your case quaternion.h is included first, meaning that Vec3 becomes an incomplete type in it. This is what the compiler is telling you.

Since you are trying to use Vec3 object as an immediate member of Quaternion object, you absolutely need Vec3 to be a complete type. The quaternion.h header must include vec3.h header. The

class Vec3;

declaration achieves absolutely nothing in quaternion.h, so you can just remove it.

Given the above, it follows that vec3.h cannot include quaternion.h, or you'll end up with circular inclusion, which never achieves anything. Remove the inclusion of quaternion.h from vec3.h. Keep the

class Quaternion;

declaration in vec3.h and see if it works that way.