我正在制作一个数学库(实际上是复制一个并修改它。)但是在所有错误之后只有一个错误我似乎无法摆脱。未找到Type说明符。 它位于我的Math.h的201行,就是这一行:
int Classify(const Polygon &vcPoly);
我真的尝试搜索谷歌,但我没有找到任何东西。对我来说,这并不是那么明显的错误。 这是Plane类的来源。在Math头中还有vector,ray,matrix和一些更多的数学类。类Polygon位于Plane类之后,但我在头文件的顶部包含了定义。
class Plane {
public:
Vector m_vcN, // plane normal vector
m_vcPoint; // point on plane
float m_fD; // distance to origin
//---------------------------------------
Plane(void) { /* nothing to do */ ; }
inline void Set(const Vector &vcN, const Vector &vcP);
inline void Set(const Vector &vcN, const Vector &vcP, float fD);
inline void Set(const Vector &v0, const Vector &v1, const Vector &v2);
inline float Distance(const Vector &vcPoint);
int Classify(const Polygon &vcPoly);
inline int Classify(const Vector &vcPoint);
bool Clip(const Ray*, float, Ray*, Ray*);
bool Intersects(const Vector &vc0, const Vector &vc1,
const Vector &vc2);
bool Intersects(const Plane &plane, Ray *pIntersection);
bool Intersects(const Aabb &aabb);
bool Intersects(const Obb &obb);
}; // class
希望你能帮助我。
答案 0 :(得分:2)
似乎在该行中不知道类型Polygon
。你有没有包含正确的头文件?我的猜测是Polygon.h
(或类似的东西)缺失。
编辑:如果所有类都包含在同一个标头中,则可能需要确保在需要作为类型之前定义类(使用原型)。这意味着您可以将类原型放在头文件的开头中:
// prototype for Polygon
class Polygon;
答案 1 :(得分:0)
这是两个包含彼此的标题:
Plane.h: #include“Polygon.h”
Polygon.h #include“Plane.h”
由于#include
表示'预处理命名文件并在此处插入内容',这将导致无限递归,这就是为什么常见的技术是在头文件中使用'include guards',其形式为:< / p>
#ifndef _SOMETHING_H_
#define _SOMETHING_H_
// header contents here
#endif
如何工作,如果首先包含Polygon.h,它会定义预处理器符号,然后继续包含标题顶部#include
的文件。其中一个是Plane.h,然后又试图包含Polygon.h,但由于Polygon的保护符号被定义,它被包含为一个空文件。
这可以防止无限递归,但由于这个原因,在包含的平面定义之前没有定义多边形类型。
解决方案至少在其中一个标题中(可能在两个标题中)用类型的正向定义替换标题的包含。所以在Plane.h而不是:
#include "Polygon.h"
你这样做:
class Polygon;
你可以在Polygon.h中做同样的事情。
请注意,没有定义的正向声明类型是所谓的不完整类型,并且在标题中如何使用它有一些限制:您可以定义指针或对它的引用(这是在示例中使用它的方式) ,但您可能无法定义实例,按值传递,访问字段等。