VisualC++ compilerfout C3646: onbekende overschrijvingsspecificatie

Ik probeer een eenvoudige DirectX11-engine te coderen, maar ik krijg steeds deze vreemde fout en ik kan het probleem niet vinden: ik definieer een Terrain-klasse en een Mesh-klasse en #include de Mesh-klasse in de Terrain-klasse:

de definitie van de Terrain-klasse:

// 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);
};

en de definitie van de Mesh-klasse:

// 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]));
}

Wanneer ik de code compileer, krijg ik:

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  

Ik heb het web doorzocht, maar de meeste resultaten tonen ontbrekende puntkomma’s of circulaire inclusieproblemen, maar ik kan er geen vinden.

bewerken
Ik vond het probleem, maar ik kan niet uitleggen waarom mijn oplossing werkt:
Na de inclusieboom:
Terrain.h – & GT; Mesh.h – & GT; Game.h – & GT; Renderer.h – & gt; Terrain.h

elimineren #Include “terrain.h” (aangezien ik gewoon terrein * pointers in de klas declareer) en het toevoegen aan terrain.cpp lijkt het probleem op te lossen.
Het moet dus een kwestie van circulaire inclusie zijn, maar zou ik daar niet tegen moeten worden bewaakt met behulp van header / inclusief bewakers?


Antwoord 1, Autoriteit 100%

Uw probleem is dat #pragma oncealleen voorkomt tegen dubbele opname. D.w.z. Het maakt de volgende veilige (vereenvoudigd om het duidelijk te maken):

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

Het lost geen circulaire inclusie op, wat veel moeilijker is om automatisch op te lossen. Met dubbele opname is het duidelijk welke eerst is. Maar een cirkel is niet begonnen.

Other episodes