c ++ - 错误C3646:未知的覆盖说明符

时间:2017-09-13 03:18:36

标签: c++ syntax

我修改了我的项目,编译后会出现一些奇怪的错误。

#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类定义,以防缺少分号,但我找不到任何分号。

任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

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

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

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

因此,此代码中无法显示material.h中的所有名称。 编译器无法识别TransformHierarchyMatrix4x4。 许多编制者会抱怨与"missing type specifier - int assumed"

类似的词语

答案 1 :(得分:0)

这只是Microsoft的另一个模仿对象。实质上是这样:

        shrinkWrap: true,
        itemCount: alo.length,
        itemBuilder: (BuildContext ctxt, int Index) {
          return Card(
              child: Padding(
            padding: const EdgeInsets.all(15.0),
            child: Column(
              children: <Widget>[
              alo[Index]['rewards']!=null?
                alo[Index]['rewards'].forEach((k, v) {
                  return Text(v['name']);
                }):SizedBox()


              ],
            ),
          ));
        });

如果将其提交给像g ++这样的明智编译器,它会为您提供有用的错误消息:

  

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

另一方面,MSVC提出了以下问题:

  

(3):错误C3646:“ y”:未知的替代说明符
  (3):错误C4430:缺少类型说明符-假定为int。注意:C ++不会   支持default-int

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

  

错误:“ Matrix4x4”未命名类型

答案 2 :(得分:0)

在我的情况下,发现头文件对类[即myComboBoxData]具有以下指令

#ifndef __COMBOBOXDATA__
#define __COMBOBOXDATA__
// ... 
class myComboBoxData
{
    // ...
}
#endif

下面的另一个类尝试使用myComboBoxData

class TypeDlg : public CDialog
{
    myComboBoxData cbRow,cbCol;
    // ...
}

错误信息如上弹出:

“错误C3646:'cbRow':未知的替代说明符”。

解决方案:

问题是OTHER标头已经使用了指令名称(__COMBOBOXDATA__)。

因此,请确保使用其他名称,例如(__myCOMBOBOXDATA__