错误:字段的类型不完整

时间:2010-10-22 17:33:39

标签: c++ incomplete-type

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

再次感谢您的帮助=)

3 个答案:

答案 0 :(得分:10)

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

由于您尝试将Vec3对象用作Quaternion对象的直接成员,因此您绝对需要Vec3才能成为完整类型。 quaternion.h标头必须包含vec3.h标头。

class Vec3;

声明在quaternion.h中完全没有任何效果,因此您可以将其删除。

鉴于上述情况,vec3.h 无法包含quaternion.h,或者您将最终获得循环包含,但从未实现任何目标。从quaternion.h中删除vec3.h的加入项。

class Quaternion;
<{1}}中的

声明,看看它是否有效。

答案 1 :(得分:3)

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

然后,quaternion.h可以包含vec3.h,所有内容都会编译。另外,正如JaredPar建议的那样,删除Vec3quaternion.h的前向声明。

答案 2 :(得分:0)

问题是你的文件包含了彼此没有循环依赖的地方。 vec3不应该包括四元数,那么一切都会好起来的。

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

vecr3.h - &gt;包括四元数 quaternion.h - &gt;包括vec3,但包括警卫,所以没有任何事情发生 quaternion.h - &gt;预先确定Vec3,
quaternion.h - &gt;尝试使用vec3 //失败
vec3.h - &gt;实际上声明了vec3

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