2010-10-22 120 views
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 

感谢您的帮助再次=)

+0

circluar依赖性? – 2013-01-21 19:11:07

回答

10

那么,你有两个头文件的圆形包含:vec3.hquaternion.h。包括警卫将确保每个标题仅包含一次。其中一个将首先被包括,另一个 - 第二个。在你的情况下,首先包含quaternion.h,这意味着Vec3成为一个不完整的类型。这是编译器告诉你的。

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

class Vec3; 

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

鉴于上述情况,可以得出vec3.h不能包括quaternion.h,或者你会夹杂,从未达到什么告终。从vec3.h删除包含quaternion.h。请保留

class Quaternion; 

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

0

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

现在的编译器给了错误,是因为你预先声明VEC3但如果包括VEC3完整定义不读:

vecr3.h - >包括四元
quaternion.h - >包括VEC 3,但包括-卫士所以什么也没发生
quaternion.h - >预先声明VEC3,
quaternion.h - >尝试使用VEC3 //失败
vec3.h - >实际声明VEC3

唯一正确的顺序是第一次vec3包括只有THEN th e quaternion包括。

3

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

然后,quaternion.h可以包括vec3.h和一切都会编译。另外,正如JaredPar所建议的,删除Vec3的前向声明quaternion.h