C4430错误-缺少类型说明符-假定为int

C4430 Error - missing type specifier - int assumed

本文关键字:说明符 int 类型 错误 C4430      更新时间:2023-10-16

我正在制作一个数学库(实际上复制一个并修改它),但毕竟有一个错误,我似乎无法摆脱。没有找到类型说明符。它在my Math.h的第201行,也就是这一行:

     int   Classify(const Polygon &vcPoly);

我真的试着搜索谷歌,但我什么也没找到。对我来说,问题并不是那么明显。下面是Plane类的源代码。在Math头也有向量,射线,矩阵,和一些更多的数学类。类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

希望你能帮助我。

在这一行中似乎不知道类型Polygon。是否包含了正确的头文件?我的猜测是Polygon.h(或类似的东西)缺失。

EDIT:如果所有类都包含在同一个头文件中,也许你必须确保类在需要作为类型之前被定义(带有原型)。这意味着你可以把类原型放在头文件的开头:

// prototype for Polygon
class Polygon;

这是两个头部相互包含的情况:

Plane.h:# include"Polygon.h"

Polygon.h# include"Plane.h"

由于#include意味着"预处理命名文件并在这里插入内容",这将导致无限递归,这就是为什么一种常见的技术是在头文件中使用"包含保护",以以下形式:

#ifndef _SOMETHING_H_
#define _SOMETHING_H_
// header contents here
#endif

这是如何工作的,如果你首先包含多边形。h,它定义预处理器符号,然后继续包括你#include在你的头顶部的文件。其中之一是Plane.h,然后它又试图包含Polygon.h,但由于Polygon的保护符号被定义,它被包含为一个空文件。

这可以防止无限递归,但正因为如此,在包含的平面定义之前没有多边形类型的定义。

解决方案是至少在其中一个头文件中(也可能在两个头文件中)用该类型的前向定义替换头文件的包含。在plane。h中,而不是:

#include "Polygon.h"
你:

class Polygon;

你可以在Polygon.h中做同样的事情。

请注意,没有定义的前向声明类型被称为不完整类型,并且在头文件中使用它是有限制的:您可以定义指向它的指针或引用(这就是示例中使用它的方式,但您可以不定义实例,按值传递,访问字段等。