6

quaternion.h:15:错误:字段“v”的类型不完整

你好!我陷入了一个似乎无法解决的错误。

下面是我的代码:

#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

我的 Vec.h 看起来像这样:

#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

再次感谢您的帮助 =)

4

3 回答 3

9

好吧,你有两个头文件的循环包含:vec3.hquaternion.h. 包含守卫将确保每个标头仅包含一次。其中一个将首先被包括在内,另一个 - 第二个。在您的情况下quaternion.h,首先包含在内,这意味着它Vec3成为其中的不完整类型。这就是编译器告诉你的。

由于您试图将Vec3object 用作​​ object 的直接成员Quaternion,因此您绝对需要Vec3是一个完整的类型。标quaternion.h头必须包含vec3.h标头。这

class Vec3;

声明在 中绝对没有实现quaternion.h,因此您可以将其删除。

鉴于上述情况,vec3.h 不能包含quaternion.h,否则您将最终得到循环包含,这永远不会实现任何目标。删除包含quaternion.hfrom vec3.h。保持

class Quaternion;

声明vec3.h并查看它是否以这种方式工作。

于 2010-10-22T17:43:36.407 回答
3

问题是相互包含.h. 编译器知道类型,但在某些时候它们是不完整的。我的建议是只Quarternion在文件中转发声明vec3.h,但不包括quaternion.h

然后,quaternion.h可以包含vec3.h,一切都会编译。此外,正如 JaredPar 建议的那样,删除 in 的前向Vec3声明quaternion.h

于 2010-10-22T17:43:29.057 回答
0

问题是您的文件在没有循环依赖的情况下相互包含。vec3 不应包含四元数,那么一切都会好起来的。

现在编译器给出的错误是因为您预先声明了 vec3 但如果包含 vec3 则不会读取完整定义:

vecr3.h --> 包括四元数
quaternion.h --> 包括 vec3 ,但是包括守卫所以什么都不会发生
quaternion.h --> predeclare Vec3,
quaternion.h --> 尝试使用 vec3 //fail
vec3.h - -> 实际上声明 vec3

唯一正确的顺序是第一个 vec3 包含,然后只有四元数包含。

于 2010-10-22T17:42:57.310 回答