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 =)
Well, you have circular inclusion of two header files:
vec3.handquaternion.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 casequaternion.his included first, meaning thatVec3becomes an incomplete type in it. This is what the compiler is telling you.Since you are trying to use
Vec3object as an immediate member ofQuaternionobject, you absolutely needVec3to be a complete type. Thequaternion.hheader must includevec3.hheader. Thedeclaration achieves absolutely nothing in
quaternion.h, so you can just remove it.Given the above, it follows that
vec3.hcannot includequaternion.h, or you’ll end up with circular inclusion, which never achieves anything. Remove the inclusion ofquaternion.hfromvec3.h. Keep thedeclaration in
vec3.hand see if it works that way.