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 :(得分:10)
嗯,您已经循环包含两个头文件:vec3.h
和quaternion.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建议的那样,删除Vec3
中quaternion.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包含,只有四元数包括。