Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error: Field has an incomplete type

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 =)

like image 519
Aero Avatar asked Oct 22 '10 17:10

Aero


2 Answers

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.

like image 84
AnT Avatar answered Nov 19 '22 08:11

AnT


The problem is mutual inclusion of the .h. The compiler knows the types, but at some point they are incomplete. My advice would be to just forward declare Quarternion in the file vec3.h, but NOT include quaternion.h.

Then, quaternion.h can include vec3.h and everything will compile. Also, as JaredPar suggested, remove the forward declaration of Vec3 in quaternion.h.

like image 3
Diego Sevilla Avatar answered Nov 19 '22 06:11

Diego Sevilla