c++ - 错误 C3646:未知的覆盖说明符
Posted
技术标签:
【中文标题】c++ - 错误 C3646:未知的覆盖说明符【英文标题】:c++ - error C3646: unknown override specifier 【发布时间】:2017-09-13 03:18:35 【问题描述】:我修改了我的项目,编译后弹出一些奇怪的错误。
#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
当我稍微改变声明的顺序时,错误总是出现在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
我已经搜索过关于 SO 的类似问题,但似乎没有一个有用。
我检查了我的vec3f
、Triangle
类定义,以防缺少分号但我找不到。
谁能帮忙?
【问题讨论】:
Material 是在哪里定义的? 如果在material
后面加上double wtf;
之类的原始元素,你会得到什么?
@starmole 嗨!我有一个shape.h
,其中定义了Triangle
。 material.h
包含在 shape.h
中。我不知道当我使用class Triangle
作为前向声明时是否会包含class Material
。但是我尝试在这里包含material.h
,仍然是同样的问题。
根据错误,听起来Matrix4x4
和TransformHierarchy
都没有被声明。您可能缺少两者的包含。
您可以转发声明一个指针(如三角形),但需要完全定义一个成员,如 TransformHierarchy 的 Material。
【参考方案1】:
这只是 Microsoft 的另一个错误。本质上是这样的:
class C
x y ;
;
如果你将它提交给像 g++ 这样的合理编译器,它会给你一个有用的错误信息:
3:2:错误:“x”没有命名类型
另一方面,MSVC 提出了这种胡言乱语:
(3):错误 C3646:“y”:未知覆盖说明符 (3):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 没有 支持默认整数
使用此密钥,您可以将 Microsoft 的错误消息解密为:
错误:'Matrix4x4' 没有命名类型
【讨论】:
【参考方案2】:该错误很可能是因为未定义 TransformHierarchy
和 Matrix4x4
。
如果它们没有在"assert.h"
和"vec3f.h"
中定义,应该是这种情况。
仅当您仅使用引用类型和/或指针类型时,前向声明就足够了。因此,转发声明Triangle
是可以的。但是转发声明Triangle
并不意味着您的shape.h
已被处理。你的material.h
也没有,它包含在shape.h
中。
因此,material.h
中的所有名称在此代码中均不可见。
编译器无法识别TransformHierarchy
和Matrix4x4
。
很多编译者会抱怨类似"missing type specifier - int assumed"
的词
【讨论】:
【参考方案3】:在我的例子中,发现一个头文件具有以下类的指令[即,myComboBoxData]
#ifndef __COMBOBOXDATA__
#define __COMBOBOXDATA__
// ...
class myComboBoxData
// ...
#endif
因为下面的另一个类尝试使用myComboBoxData
类
class TypeDlg : public CDialog
myComboBoxData cbRow,cbCol;
// ...
弹出的错误信息如上:
“错误 C3646: 'cbRow': 未知的覆盖说明符”。
解决方案:
问题是指令名称 (__COMBOBOXDATA__
) 已被 OTHER 标头使用。
因此,请确保使用其他名称,例如 (__myCOMBOBOXDATA__
)。
【讨论】:
以上是关于c++ - 错误 C3646:未知的覆盖说明符的主要内容,如果未能解决你的问题,请参考以下文章