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 的类似问题,但似乎没有一个有用。 我检查了我的vec3fTriangle 类定义,以防缺少分号但我找不到。

谁能帮忙?

【问题讨论】:

Material 是在哪里定义的? 如果在material 后面加上double wtf; 之类的原始元素,你会得到什么? @starmole 嗨!我有一个shape.h,其中定义了Trianglematerial.h 包含在 shape.h 中。我不知道当我使用class Triangle 作为前向声明时是否会包含class Material。但是我尝试在这里包含material.h,仍然是同样的问题。 根据错误,听起来Matrix4x4TransformHierarchy 都没有被声明。您可能缺少两者的包含。 您可以转发声明一个指针(如三角形),但需要完全定义一个成员,如 TransformHierarchy 的 Material。 【参考方案1】:

这只是 Microsoft 的另一个错误。本质上是这样的:

class C
  
  x y ;
   ;

如果你将它提交给像 g++ 这样的合理编译器,它会给你一个有用的错误信息:

3:2:错误:“x”没有命名类型

另一方面,MSVC 提出了这种胡言乱语:

(3):错误 C3646:“y”:未知覆盖说明符 (3):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 没有 支持默认整数

使用此密钥,您可以将 Microsoft 的错误消息解密为:

错误:'Matrix4x4' 没有命名类型

【讨论】:

【参考方案2】:

该错误很可能是因为未定义 TransformHierarchyMatrix4x4

如果它们没有在"assert.h""vec3f.h" 中定义,应该是这种情况。

仅当您仅使用引用类型和/或指针类型时,前向声明就足够了。因此,转发声明Triangle 是可以的。但是转发声明Triangle 并不意味着您的shape.h 已被处理。你的material.h 也没有,它包含在shape.h 中。

因此,material.h 中的所有名称在此代码中均不可见。 编译器无法识别TransformHierarchyMatrix4x4。 很多编译者会抱怨类似"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:未知的覆盖说明符的主要内容,如果未能解决你的问题,请参考以下文章

由于头文件层次结构,C3646和C4430?

未知原因的编译器错误 (C++)

c++ / g++ - 错误:未知的伪操作:`。位置'

Torch Vision C++ 接口错误“未知内置操作:torchvision::nms”

不在 UI 中的 Visual Studio 构建错误

错误说“相机未定义”,但我确实定义了它