Ошибка компилятора c3646

Search code, repositories, users, issues, pull requests…

Provide feedback

Saved searches

Use saved searches to filter your results more quickly

Sign up

I modified my project and after compiling there pop up some weird error.

#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

When I change the order of the declaration a little bit, the error always occurs the line after Material material, but with different message:

#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

I’ve searched for similar questions on SO but none seems useful.
I’ve checked my vec3f, Triangle class definition in case there are missing semicolons but I can’t find any.

Can any one help?

asked Sep 13, 2017 at 3:18

jinglei's user avatar

jingleijinglei

3,27911 gold badges27 silver badges46 bronze badges

5

This is just another Microsoft cock-up. Here it is in essence:

class C
  {
  x y ;
  } ;

If you submit this to a sensible compiler like g++, it gives you a helpful error message:

3:2: error: ‘x’ does not name a type

MSVC, on the other hand, comes up with this gibberish:

(3): error C3646: ‘y’: unknown override specifier
(3): error C4430: missing type specifier — int assumed. Note: C++ does not
support default-int

With this key, you can decrypt Microsoft’s error message into:

error: ‘Matrix4x4’ does not name a type

answered Oct 26, 2019 at 14:19

TonyK's user avatar

TonyKTonyK

16.8k4 gold badges37 silver badges73 bronze badges

The error is most likely because that TransformHierarchy and Matrix4x4 are not defined.

If they are not defined in "assert.h" and "vec3f.h", this should be the case.

Forward declaration is enough only when you use the reference types and/or pointer types only. Therefore, to forward declare Triangle is OK. But forward declare Triangle does not mean your shape.h is processed. Neither does your material.h which is included in shape.h.

Therefore, all names in material.h is not visible from this code.
TransformHierarchy and Matrix4x4 are not recognized by the compiler.
Many of the compliers will complain with words similar to "missing type specifier - int assumed"

answered Sep 13, 2017 at 4:17

doraemon's user avatar

doraemondoraemon

2,2961 gold badge17 silver badges36 bronze badges

In my case, it was found that a header file had the following directives for a class [ie, myComboBoxData]

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

As another class below tried to use myComboBoxData class

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

the error message popped up as above:

«error C3646: ‘cbRow’: unknown override specifier».

Solution:

The problem was the directive name (__COMBOBOXDATA__) was already used by OTHER header.

Thus, make sure to use some other name like (__myCOMBOBOXDATA__).

answered May 31, 2020 at 5:56

Meung Kim's user avatar

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
 
#include <iostream>
#include <string>
 
using namespace std;
 
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 
class Square
{
protected:
    string text;    int x;
    int y;
    int width;
    int height;
public:
    virtual void Print() = 0;
};

Добавлено через 2 минуты

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#pragma once
 
#include <Windows.h>
#include "Square.h"
#include "WindowVector.h"
 
class WindowVector;
 
class Window : public Square
{
public:
    Window(int, int, int);
    Window(const Window&);
    Window& operator=(const Window&);
    void change(int, int, int);
    void Delete();
    void Print();
    friend WindowVector;
};
 
Window::Window(int x, int y, int count)
{
    text = "New window";
    text += ' ';
    text += (count + '0'); // преобразовываем int в char
    this->x = x;
    this->y = y;
    width = 30;
    height = 11;
}
 
Window::Window(const Window &obj)
{
    text = obj.text;
    x = obj.x;
    y = obj.y;
    width = obj.width;
    height = obj.height;
}
 
Window& Window::operator=(const Window &obj)
{
    if (this == &obj)
        return *this;
    text = obj.text;
    x = obj.x;
    y = obj.y;
    width = obj.width;
    height = obj.height;
    return *this;
}
 
void Window::change(int x, int y, int count)
{
    text = "New window";
    text += ' ';
    text += (count + '0');
    this->x = x;
    this->y = y;
    width = 30;
    height = 11;
}
 
void Window::Delete()
{
    this->~Window();
}
 
void Window::Print()
{
    COORD c = { x, y };
    DWORD d;
 
    SetConsoleCursorPosition(hOut, c);
    SetConsoleTextAttribute(hOut, 0x17);
    for (int i = 0; i <= width; ++i)
    {
        if (i == width)
            cout << 'X';
        else if (i < text.size())
            cout << text[i];
        else
            cout << ' ';
    }
    SetConsoleTextAttribute(hOut, 0x88);
    for (int i = 1; i <= height; ++i)
    {
        c.X = x;
        c.Y = y + i;
 
        FillConsoleOutputAttribute(hOut, 0xff, width + 1, c, &d);
        FillConsoleOutputCharacter(hOut, ' ', width + 1, c, &d);
        c.X = x + width + 1;
        SetConsoleCursorPosition(hOut, c);
        cout << ' ';
    }
    c.X = x + 1;
    c.Y = y + height + 1;
    FillConsoleOutputAttribute(hOut, 0x80, width + 1, c, &d);
    FillConsoleOutputCharacter(hOut, ' ', width + 1, c, &d);
    SetConsoleTextAttribute(hOut, 0x0);
}

Добавлено через 21 секунду

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#pragma once
 
#include <Windows.h>
#include "Square.h"
#include "WindowVector.h"
 
class WindowVector;
 
class CloseButton : public Square
{
public:
    CloseButton();
    CloseButton(string, int, int, int, int);
    CloseButton(const CloseButton&);
    CloseButton& operator=(const CloseButton&);
    void Delete();
    void Print();
    friend WindowVector;
};
 
CloseButton::CloseButton()
{
    text = "CLOSE";
    x = 0 + 19;
    y = 0 + 9;
    width = 6;
    height = 3;
}
 
CloseButton::CloseButton(string header, int x, int y, int width, int height)
{
    text = header;
    this->x = x;
    this->y = y;
    this->width = width;
    this->height = height;
}
 
CloseButton::CloseButton(const CloseButton &obj)
{
    text = obj.text;
    x = obj.x;
    y = obj.y;
    width = obj.width;
    height = obj.height;
}
 
CloseButton& CloseButton::operator=(const CloseButton &obj)
{
    if (this == &obj)
        return *this;
    text = obj.text;
    x = obj.x;
    y = obj.y;
    width = obj.width;
    height = obj.height;
    return *this;
}
 
void CloseButton::Delete()
{
    this->~CloseButton();
}
 
void CloseButton::Print()
{
    COORD c = { x, y };
 
    SetConsoleCursorPosition(hOut, c);
    SetConsoleTextAttribute(hOut, 0x80);
    for (int i = 0; i <= width; ++i)
    {
        if (i == 0)
            cout << ' ';
        else if (i <= text.size())
            cout << text[i - 1];
        else
            cout << ' ';
    }
    SetConsoleTextAttribute(hOut, 0x0); 
}
 
class CheckButton : public Square
{
public:
    CheckButton();
    CheckButton(string, int, int, int, int);
    CheckButton(const CheckButton&);
    CheckButton& operator=(const CheckButton&);
    void Delete();
    void Print();
    friend WindowVector;
};
 
CheckButton::CheckButton()
{
    text = "CHECK";
    x = 0 + 4;
    y = 0 + 9;
    width = 6;
    height = 3;
}
 
CheckButton::CheckButton(string header, int x, int y, int width, int height)
{
    text = header;
    this->x = x;
    this->y = y;
    this->width = width;
    this->height = height;
}
 
CheckButton::CheckButton(const CheckButton &obj)
{
    text = obj.text;
    x = obj.x;
    y = obj.y;
    width = obj.width;
    height = obj.height;
}
 
CheckButton& CheckButton::operator=(const CheckButton &obj)
{
    if (this == &obj)
        return *this;
    text = obj.text;
    x = obj.x;
    y = obj.y;
    width = obj.width;
    height = obj.height;
    return *this;
}
 
void CheckButton::Delete()
{
    this->~CheckButton();
}
 
void CheckButton::Print()
{
    COORD c = { x, y };
 
    SetConsoleCursorPosition(hOut, c);
    SetConsoleTextAttribute(hOut, 0x80);
    for (int i = 0; i <= width; ++i)
    {
        if (i == 0)
            cout << ' ';
        else if (i <= text.size())
            cout << text[i - 1];
        else
            cout << ' ';
    }
    SetConsoleTextAttribute(hOut, 0x0);
}

Добавлено через 16 секунд

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#pragma once
 
#include <Windows.h>
#include "Square.h"
#include "WindowVector.h"
 
class WindowVector;
 
class Field : public Square
{
public:
    Field();
    Field(string, int, int, int, int);
    Field(const Field&);
    Field& operator=(const Field&);
    void Delete();
    void Print();
    friend WindowVector;
};
 
Field::Field()
{
    text.clear();
    x = 0 + 2;
    y = 0 + 2;
    width = 28;
    height = 5;
}
 
Field::Field(string header, int x, int y, int width, int height)
{
    text = header;
    this->x = x;
    this->y = y;
    this->width = width;
    this->height = height;
}
 
Field::Field(const Field &obj)
{
    text = obj.text;
    x = obj.x;
    y = obj.y;
    width = obj.width;
    height = obj.height;
}
 
Field& Field::operator=(const Field &obj)
{
    if (this == &obj)
        return *this;
    text = obj.text;
    x = obj.x;
    y = obj.y;
    width = obj.width;
    height = obj.height;
    return *this;
}
 
void Field::Delete()
{
    this->~Field();
}
 
void Field::Print()
{
    COORD c = { x, y };
    DWORD d;
 
    SetConsoleCursorPosition(hOut, c);
    SetConsoleTextAttribute(hOut, 0x99);
    for (int i = 0; i <= height; ++i)
    {
        c.X = x;
        c.Y = y + i;
        FillConsoleOutputAttribute(hOut, 0x99, width - 1, c, &d);
        FillConsoleOutputCharacter(hOut, ' ', width - 1, c, &d);
        cout << ' ';
    }
    SetConsoleTextAttribute(hOut, 0x0);
}



0



I use Visual Studio 2015 and I have a C# Application-Project that defines a COM-Interface and generates a .tlb file on compilation. Now I want to import that Csharp.tlb into an idl.

MyLibrary.idl:

import "oaidl.idl";
import "ocidl.idl";
import "Cplusplus.idl";

library MyLibrary
{
  importlib("stdole32.tlb");
  importlib("stdole2.tlb");
  importlib("Csharp.tlb");

  interface IMyCOM : IDispatch
  {
    [propget, id(1)]
    HRESULT CpluplusObject
    (
      [out,retval] ICplusplusObject** cplusplusObject
    );

    [propget, id(2)]
    HRESULT CsharpObject
    (
      [out, retval] ICsharpObject** csharpObject
    );
  }

  coclass MyCOM
  {
    [default] interface IMyCOM;
  };
}

During compilation I get an error

C3646 ‘csharpObject’: unknown override specifier in MyLibrary.tlh

MyLibrary.tlh was auto generated by the compilation and looks as the following

MyLibrary.tlh:

#pragma once
#pragma pack(push, 8)

#include <comdef.h>

namespace MyLibrary {

  struct __declspec(uuid("8e664998-bc93-48e7-adcc-84fc8598cd5d"))
  /* dual interface */ ICplusplusObject;

  _COM_SMARTPTR_TYPEDEF(ICplusplusObject, __uuidof(ICplusplusObject));

  struct __declspec(uuid("388ebf11-05c8-4b86-b2bd-60f0ef38695e"))
  IMyLibrary : IDispatch
  {
    __declspec(property(get=GetCplusplusObject))
    ICplusplusObjectPtr cplusplusObject;
    __declspec(property(get=GetCsharpObject))
    ICsharpObjectPtr csharpObject;

    ICplusplusObjectPtr GetCplusplusObject ( );
    ICsharpObjectPtr GetCsharpObject ( );

    virtual HRESULT __stdcall get_CplusplusObject (
      /*[out,retval]*/ struct ICplusplusObject * * cplusplusObject ) = 0;
    virtual HRESULT __stdcall get_CsharpObject (
      /*[out,retval]*/ struct ICsharpObject * * csharpObject ) = 0;
  }

  __declspec(implementation_key(1)) ICplusplusObjectPtr IMyLibrary::GetcplusplusObject ( );
  __declspec(implementation_key(2)) ICsharpObjectPtr IMyLibrary::GetcsharpObject ( );
}

The error means that ICsharpObjectPtr or ICsharpObject respectively is not known which I understand so far. ICplusplusObjectPtr is known because import «ICplusplus.idl» added the definitions into the .tlh and importlib(«ICsharp.tlb»); did not obviously.

For Test reasons I generated the ICsharp.idl out of the .tlb by using OLE/COM Object Viewer and made an import of that idl. The error was gone after that.

But why does the importlib of the .tlb not work directly? I do not want to generate an idl file every time out of the .tlb.

I think that there is an #include «ICsharp.tlh» missing or something to make the type known for the .tlh. But how to tell the idl or the compiler to properly reference the ICsharpObject?

Thank you so much in advance for your help.

Я пытаюсь написать простой движок DirectX11, но продолжаю получать эту странную ошибку и не могу найти проблему: я определяю класс Terrain и класс Mesh и #include класс Mesh в классе Terrain:

определение класса Terrain:

// Terrain.h
#pragma once

#include "Noise.h"#include "Mesh.h"
class Terrain
{
public:
Terrain(float width, float depth, int numVerticesW, int numVerticesD);
~Terrain();
float GetHeight(float x, float z);
void Draw();
private:
Mesh mMesh;                     // I get the error on this line
Noise mNoiseGenerator;
std::vector<float> mHeights;
void CreateTerrain(float width, float depth, int numVerticesW, int numVerticesD);
float ComputeHeight(float x, float z, float startFrequency, float startAmplitude, float persistence, int octaves);
};

и определение класса Mesh:

// Mesh.h
#pragma once

#include <d3d11.h>
#include <vector>
#include "Game.h"
class Mesh
{
public:
Mesh();
~Mesh();
template <typename T, unsigned int N>
void LoadVertexBuffer(T data[][N], unsigned int size, bool dynamic = false);
void LoadIndexBuffer(std::vector<unsigned int> indices);
void SetVertexCount(unsigned int vertexCount);
void Bind();
void Draw();
private:
std::vector<ID3D11Buffer*> mVertexBuffers;
std::vector<unsigned int> mStrides;
ID3D11Buffer *mIndexBuffer;
unsigned int mVertexCount;
};template <typename T, unsigned int N>
void Mesh::LoadVertexBuffer(T data[][N], unsigned int size, bool dynamic)
{
D3D11_BUFFER_DESC bufferDesc = {};
bufferDesc.Usage = dynamic ? D3D11_USAGE_DYNAMIC : D3D11_USAGE_IMMUTABLE;
bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bufferDesc.ByteWidth = sizeof(T[N]) * size;
bufferDesc.CPUAccessFlags = dynamic ? D3D11_CPU_ACCESS_WRITE : 0;
bufferDesc.MiscFlags = 0;
bufferDesc.StructureByteStride = 0;

D3D11_SUBRESOURCE_DATA bufferData = {};
bufferData.pSysMem = data;

ID3D11Buffer *buffer;
Game::GetInstance()->GetDevice()->CreateBuffer(&bufferDesc, &bufferData, &buffer);
mVertexBuffers.push_back(buffer);
mStrides.push_back(sizeof(T[N]));
}

Когда я компилирую код, я получаю:

Severity    Code    Description Project File    Line    Suppression State
Error   C3646   'mMesh': unknown override specifier DirectX11 engine 0.3    c:\users\luca\desktop\programming\code\c++\source\visual studio\directx11 engine 0.3\terrain.h  14
Severity    Code    Description Project File    Line    Suppression State
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    DirectX11 engine 0.3    c:\users\luca\desktop\programming\code\c++\source\visual studio\directx11 engine 0.3\terrain.h  14

Я искал в Интернете, но большинство результатов показывают пропущенные точки с запятой или циклические проблемы с включением, но я не могу их найти.

РЕДАКТИРОВАТЬ
Я обнаружил проблему, но не могу объяснить, почему мое решение работает:
следуя дереву включения:
Terrain.h -> Mesh.h -> Game.h -> Renderer.h -> Terrain.h

устранение #include «Terrain.h» (поскольку я просто объявляю указатели Terrain * внутри класса) и добавление его в Terrain.cpp, похоже, решает проблему.
Так что, должно быть, речь идет о круговом включении, но разве я не должен быть защищен от этого с помощью защиты заголовка / включения?

1

Решение

Ваша проблема в том, что #pragma once предотвращает только двойное включение. То есть это делает следующее безопасным (упрощенным, чтобы сделать это очевидным):

// Terrain.cpp
#include "Terrain.h"#include "Terrain.h"

Это не решает круговое включение, которое гораздо сложнее решить автоматически. С двойным включением понятно, кто из них первый. Но у круга нет начала.

2

Другие решения

Других решений пока нет …

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Ошибка компилятора c2731
  • Ошибка ккт 7011
  • Ошибка компилятора c2429
  • Ошибка компилятора c2679
  • Ошибка компилятора c2400

  • Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: