我修改了我的项目,编译后弹出一些奇怪的错误。
#ifndef BART_RAY_TRACER_MESH_H
#define BART_RAY_TRACER_MESH_H
#include <vector>
#include "assert.h"
#include "vec3f.h"
class Triangle;
class Mesh {
public:
uint32_t nverts;
bool _is_static;
vec3f *verts;
vec3f *_verts_world;
Material material;
// 2 error occurs at the line below
Matrix4x4 _trans_local_to_world; // '_trans_local_to_world': unknown override specifier & missing type specifier - int assumed. Note: C++ does not support default-int
Matrix4x4 _trans_local_to_world_inv;
TransformHierarchy *_trans_hierarchy;
std::vector<Triangle* > triangles;
// ...
};
#endif
Run Code Online (Sandbox Code Playgroud)
当我稍微改变声明的顺序时,错误总是发生在 之后的行Material material,但有不同的消息:
#ifndef BART_RAY_TRACER_MESH_H
#define BART_RAY_TRACER_MESH_H
#include <vector>
#include "assert.h"
#include "vec3f.h"
class Triangle;
class Mesh {
public:
uint32_t nverts;
bool _is_static;
vec3f *verts;
vec3f *_verts_world;
Material material;
// 2 error occurs at the line below
TransformHierarchy *_trans_hierarchy; // error C2143: syntax error: missing ';' before '*' & error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Matrix4x4 _trans_local_to_world;
Matrix4x4 _trans_local_to_world_inv;
std::vector<Triangle* > triangles;
// ...
};
#endif
Run Code Online (Sandbox Code Playgroud)
我在 SO 上搜索过类似的问题,但似乎没有一个有用。我检查了我的vec3f,Triangle类定义,以防缺少分号,但我找不到任何分号。
任何人都可以帮忙吗?
这只是微软的另一个错误。这里的本质是:
class C
{
x y ;
} ;
Run Code Online (Sandbox Code Playgroud)
如果您将其提交给像 g++ 这样的合理编译器,它会给您一条有用的错误消息:
3:2: 错误:'x' 没有命名类型
另一方面,MSVC 提出了这个胡言乱语:
(3): 错误 C3646: 'y': 未知覆盖说明符
(3): 错误 C4430: 缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int
使用此密钥,您可以将 Microsoft 的错误消息解密为:
错误:“Matrix4x4”未命名类型
该错误很可能是因为TransformHierarchy和Matrix4x4没有定义。
如果它们没有在"assert.h"和中定义"vec3f.h",则应该是这种情况。
仅当您仅使用引用类型和/或指针类型时,前向声明就足够了。因此,转发声明Triangle就可以了。但转发声明Triangle并不意味着您的shape.h已被处理。你的 which 也没有material.h包含在shape.h.
因此,material.h在此代码中看不到 中的所有名称。
TransformHierarchy并且Matrix4x4不被编译器识别。许多编译者会用类似这样的话来抱怨"missing type specifier - int assumed"