web-dev-qa-db-ja.com

Visual C ++コンパイラエラーC3646:不明なオーバーライド指定子

単純なDirectX11エンジンをコーディングしようとしていますが、この奇妙なエラーが発生し続け、問題を見つけることができません。TerrainクラスとMeshクラスを定義し、TerrainクラスにMeshクラスを#includeします。

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  

ウェブを検索しましたが、ほとんどの結果でセミコロンの欠落または循環包含の問題が示されていますが、何も見つかりません。

[〜#〜] edit [〜#〜]問題は見つかりましたが、なぜ私のソリューションが機能するのか説明できません:インクルージョンツリーに従って:Terrain.h-> Mesh.h-> Game.h-> Renderer.h-> Terrain.h

#include "Terrain.h"を削除し(クラス内でTerrain *ポインターを宣言するだけなので)、Terrain.cppに追加すると問題が解決するようです。したがって、循環インクルードの問題である必要がありますが、ヘッダー/インクルードガードを使用してこれを防ぐ必要はありませんか?

5
Luca

あなたの問題は#pragma onceは、二重包含を防止するだけです。つまりこれにより、次のことが安全になります(わかりやすくするために簡略化されています)。

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

自動的に解決するのがはるかに難しい循環包含を解決しません。二重包含により、どちらが最初であるかは明らかです。しかし、円には始まりがありません。

4
MSalters