description | title | ms.date | f1_keywords | helpviewer_keywords | ms.assetid |
---|---|---|---|---|---|
Learn more about: Compiler Error C3646 |
Compiler Error C3646 |
06/14/2018 |
C3646 |
C3646 |
4391ead2-9637-4ca3-aeda-5a991b18d66d |
Compiler Error C3646
‘specifier’ : unknown override specifier
Remarks
The compiler found a token in the position where it expected to find an override specifier, but the token was not recognized by the compiler.
For example, if the unrecognized specifier is _NOEXCEPT, replace it with the keyword noexcept
.
For more information, see Override Specifiers.
Example
The following sample generates C3646 and shows a way to fix it:
// C3646.cpp // compile with: /clr /c ref class C { void f() unknown; // C3646 // try the following line instead // virtual void f() abstract; };
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
jingleijinglei
3,23911 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
TonyKTonyK
16.6k4 gold badges36 silver badges71 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
doraemondoraemon
2,2781 gold badge17 silver badges35 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
I got the following error:
error C3646: 'closure' : unknown override specifier
The code:
void BaseOperator::mousebutton_cb(EventObject* sender, EventArgs* calldata, void* closure)
{
xd3D::Operation::Operator::BaseOperator* operator = (xd3D::Operation::Operator::BaseOperator*)closure;
MouseButtonEventArgs* e = (MouseButtonEventArgs*)calldata;
if (e->Status == Down)
operator->OnMouseButtonDown(e);
else
operator->OnMouseButtonUp(e);
}
Do you know why I have this error?
Mateen Ulhaq
23.9k18 gold badges95 silver badges132 bronze badges
asked Dec 13, 2010 at 8:22
1
operator
is a keyword. The sequence operator =
tries to declare an assignment operator which in your case would have a pointer parameter type. And your compiler wants to parse the very last closure
as a special specifier like override
(afaik an extension of MSVC), const
or such.
Rename the variable to something else, like myoperator
.
answered Dec 13, 2010 at 8:27
1
C++ | ||
|
Добавлено через 2 минуты
C++ | ||
|
Добавлено через 21 секунду
C++ | ||
|
Добавлено через 16 секунд
C++ | ||
|
0
Я пытаюсь написать простой движок 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:userslucadesktopprogrammingcodec++sourcevisual studiodirectx11 engine 0.3terrain.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:userslucadesktopprogrammingcodec++sourcevisual studiodirectx11 engine 0.3terrain.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
Другие решения
Других решений пока нет …
I have been migrating the VC6 project into VS2010 compiler. Project compiles good with VC6 version but not VS2010. Here is the code snippet. Any help or guidance would be really appreciated.
grdictrl.h
class CTndGXDICtrl : public CGXEditControl
{
int DECLARE_CONTROL(CTndGXDICtrl);
// Construction
public:
CTndGXDICtrl(CGXGridCore* pGrid, UINT nID, DWORD dwContext);
DECLARE_DYNAMIC(CTndGXDICtrl)
// Attributes
public:
CDataItemRef*
GetDataItemRef(int nRow, int nCol);
CDataEntity::deType GetTargetType(int nRow, int nCol);
DWORD GetContext(int nRow, int nCol);
void SetContext(int nRow, int nCol, CProject* pProj, DWORD dwContext);
CProject*
GetProject(int nRow, int nCol);
void SetTargetType(int nRow, int nCol, CDataEntity::deType eType);
void EmptyDataItemRef(int nRow, int nCol);
void Empty(int nRow, int nCol);
BOOL IsDataModified(int nRow, int nCol);
void SetDataModified(int nRow, int nCol, BOOL b);
// Operations
public:
//
// Returns true if the edit control is in the state to find an array index
//
BOOL CTndGXDICtrl::CanFindArrayIndex();
//
// Update a local/param entry — a CLocal/CParam
//
BOOL UpdateLocalParamEntry(CDataEntity* pDE);
//
// right mouse menu for Find and Instant XRef
//
void LoadRightMouseMenu(CPoint point, BOOL bEnableLocal);
BOOL ParseAndAssignDataItemRef(ROWCOL row, ROWCOL col, const CString& cs);
BOOL ParseAndAssignDataItemRef(const CString& cs);
// Overrides
// CGXControl interface
virtual BOOL OnValidate(ROWCOL row, ROWCOL col, const CString& s);
virtual BOOL OnValidate();
virtual BOOL OnLeftCell(ROWCOL nNewRow, ROWCOL nNewCol);
virtual BOOL OnGridChar(UINT nChar, UINT nRepCnt, UINT nFlags);
virtual BOOL LButtonDblClk(UINT nFlags, CPoint point);
virtual BOOL ValidatePaste(const CString& sPaste);
virtual BOOL SetControlText(ROWCOL nRow, ROWCOL nCol, const CString& str, UINT nFlags, const CGXStyle* pOldStyle);
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTndGXDICtrl)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CTndGXDICtrl();
private:
void GetAllOidsForXref(CDWordArray& arrOids);
// Generated message map functions
protected:
//{{AFX_MSG(CTndGXDICtrl)
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT flags);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnRmouseFindGlobalDi();
afx_msg void OnRmouseFindLocalDi();
afx_msg void OnRmouseInstantXref();
//}}AFX_MSG
LRESULT OnPostedReturnDataItem(WPARAM, LPARAM);
DECLARE_MESSAGE_MAP()
BOOL m_bInOnChange;
BOOL m_bAutoComplete;
BOOL m_bIgnoreKillFocusForFind;
BOOL DoAutoComplete();
CDIControlInfo* GetDIC(int nRow, int nCol);
};
gridctrl.cpp
#include «stdafx.h»
#include «dbg.h»
#include «dbifexp.h»
#include «gridctrl.h»
#include «launch.h»
#include «tagparse.h»
#include «tndmsgs.h»
#include «resource.h»
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#import «..binpb.tlb» named_guids //raw_interfaces_only
IMPLEMENT_CONTROL(CTndGXDICtrl, CGXEditControl)
IMPLEMENT_DYNAMIC(CTndGXDICtrl, CGXEditControl)
#define GRID_WARNING(IDP)
{
CString cs;
VERIFY(cs.LoadString(IDP));
Grid()->SetWarningText(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CTndGXDICtrl
CTndGXDICtrl::CTndGXDICtrl(CGXGridCore* pGrid, UINT nID, DWORD dwContext)
: CGXEditControl(pGrid, nID)
{
m_bInOnChange = FALSE;
m_bAutoComplete = TRUE;
m_bIgnoreKillFocusForFind = FALSE;
}
CTndGXDICtrl::~CTndGXDICtrl()
{
}
BEGIN_MESSAGE_MAP(CTndGXDICtrl, CGXEditControl)
//{{AFX_MSG_MAP(CTndGXDICtrl)
ON_WM_CHAR()
ON_WM_LBUTTONDBLCLK()
ON_COMMAND(ID_RMOUSE_FIND_GLOBAL_DI, OnRmouseFindGlobalDi)
ON_COMMAND(ID_RMOUSE_FIND_LOCAL_DI, OnRmouseFindLocalDi)
ON_COMMAND(ID_RMOUSE_INSTANT_XREF, OnRmouseInstantXref)
//}}AFX_MSG_MAP
ON_MESSAGE(TND_RETURNED_DATAITEM, OnPostedReturnDataItem)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTndGXDICtrl message handlers
void CTndGXDICtrl::EmptyDataItemRef(int nRow, int nCol)
{
CDIControlInfo* pDIC = GetDIC(nRow, nCol);
if (NULL != pDIC)
{
CDataItemRef* pDIR = NULL;
pDIR = &(pDIC ->m_cDataItemRef);
pDIR ->Empty();
}
}
void CTndGXDICtrl::Empty(int nRow, int nCol)
{
CDIControlInfo* pDIC = GetDIC(nRow, nCol);
if (NULL != pDIC)
{
CDataItemRef* pDIR = NULL;
pDIR = &(pDIC ->m_cDataItemRef);
pDIR ->Empty();
SetTargetType(nRow, nCol, CDataEntity::deNull);
}
}
CDIControlInfo* CTndGXDICtrl::GetDIC(int nRow, int nCol)
{
if ((nRow == -1) || (nCol == -1))
return NULL;
CDIControlInfo* pDIC = NULL;
CGXGridWnd* pGrid = (CGXGridWnd*) GridWnd();
if (NULL != pGrid)
{
CGXStyle s;
pGrid ->GetStyleRowCol(nRow, nCol, s);
pDIC = (CDIControlInfo*) s.GetItemDataPtr();
}
return pDIC;
}
CDataItemRef* CTndGXDICtrl::GetDataItemRef(int nRow, int nCol)
{
CDataItemRef* pDIR = NULL;
CDIControlInfo* pDIC = GetDIC(nRow, nCol);
if (NULL != pDIC)
{
pDIR = &(pDIC ->m_cDataItemRef);
}
return pDIR;
}
CDataEntity::deType CTndGXDICtrl::GetTargetType(int nRow, int nCol)
{
CDataEntity::deType eType = CDataEntity::deNull;
CDIControlInfo* pDIC = GetDIC(nRow, nCol);
if (NULL != pDIC)
{
eType = pDIC ->m_eTargetType;
}
return eType;
}
DWORD CTndGXDICtrl::GetContext(int nRow, int nCol)
{
DWORD dw = 0;
CDIControlInfo* pDIC = GetDIC(nRow, nCol);
if (NULL != pDIC)
{
dw = pDIC ->m_dwContext;
}
return dw;
}
CProject* CTndGXDICtrl::GetProject(int nRow, int nCol)
{
CProject* p = NULL;
CDIControlInfo* pDIC = GetDIC(nRow, nCol);
if (NULL != pDIC)
{
p = pDIC ->m_pProject;
}
return p;
}
void CTndGXDICtrl::SetContext(int nRow, int nCol, CProject* pProj, DWORD dwContext)
{
CDIControlInfo* pDIC = GetDIC(nRow, nCol);
if (NULL != pDIC)
{
pDIC ->m_dwContext = dwContext;
}
}
void CTndGXDICtrl::SetTargetType(int nRow, int nCol, CDataEntity::deType eType)
{
CDIControlInfo* pDIC = GetDIC(nRow, nCol);
if (NULL != pDIC)
{
pDIC ->m_eTargetType = eType;
}
}
Here is the complete error list:
c:2010fv32gridctrl.cpp(41): error C3646: ‘CRuntimeClass’ : unknown override specifier
c:2010fv32gridctrl.cpp(41): error C2143: syntax error : missing ‘;’ before ‘*’
c:2010fv32gridctrl.cpp(41): error C4430: missing type specifier — int assumed. Note: C++ does not support default-int
c:2010fv32gridctrl.cpp(41): error C2509: ‘_GetBaseClass’ : member function not declared in ‘CTndGXDICtrl’
c:2010fv32gridctrl.h(58) : see declaration of ‘CTndGXDICtrl’
Error C3646 shows up with the following line:
IMPLEMENT_DYNAMIC(CTndGXDICtrl, CGXEditControl)
I may be missing something here, any guidance will be useful.
Regards.
Учу C++ по книге, в конце главы есть задания и одно из них — сделать функцию подсчета символов в классе Document. При создании класса возникла проблема: при запуске программы появляется ошибка «C3646 begin: неизвестный спецификатор определения». Такая же ошибка с функцией end();
document.h:
#include <list>
#include <vector>
#include <iostream>
using namespace std;
using Line = vector<char>;
struct Document {
list<Line> line;
Document() { line.push_back(Line{}); }
Text_iterator begin() { return Text_iterator(line.begin(), line.begin()->begin()); } //здесь ошибка
Text_iterator end() { return Text_iterator(line.end(), line.end()->end()); } //в этой строке так же
int count();
};
istream& operator>> (istream& is, Document& d) {
for (char ch; is.get(ch);) {
d.line.back().push_back(ch);
if (ch == 'n') d.line.push_back(Line{});
}
if (d.line.back().size()) d.line.push_back(Line{});
return is;
}
class Text_iterator {
list<Line>::iterator ln;
Line::iterator pos;
public:
Text_iterator (list<Line>::iterator ll, Line::iterator pp) : ln{ll}, pos{pp} {}
char& operator* () { return *pos; }
Text_iterator& operator++ ();
bool operator== (const Text_iterator& other) const { return ln == other.ln && pos == other.pos; }
bool operator!= (const Text_iterator& other) const { return !(*this == other); }
};