2017-12-28 70 views
0

編集:Shaderクラスが追加されました。"Framework :: Graphics :: Material"のデフォルトのコンストラクタは参照できません - 削除された関数です

私はDLLライブラリを作成していますが、MS VS intellisenseとコンパイラはMeshコンストラクタについて不平を言っています。メッシュコンストラクタのMaterial属性をTextureに変更してもOKです。構造体をクラスに変更しようとしましたが、うまくいきませんでした。 FFB_FRAMEWORK_APIを削除するとmarcroもうまくいきませんでした。

DataStrictures.h

struct Vertex { 
     // position 
     glm::vec3 Position; 
     // normal 
     glm::vec3 Normal; 
     // texCoords 
     glm::vec2 TexCoords; 
     // tangent 
     glm::vec3 Tangent; 
     // bitangent 
     glm::vec3 Bitangent; 
    }; 
    struct Texture 
    { 
     unsigned int id; 
     std::string type; 
    }; 

main.h

#ifdef FFB_FRAMEWORK_EXPORTS 
#define FFB_FRAMEWORK_API __declspec(dllexport) 
#else 
#define FFB_FRAMEWORK_API __declspec(dllimport) 
#endif 

class FFB_FRAMEWORK_API Shader 
     { 
     public: 
      unsigned int ID; 
      // constructor generates the shader on the fly 
      Shader(const char* vertexPath, const char* fragmentPath, const char* geometryPath = nullptr); 

      // activate the shader 
      void use(); 

      // utility uniform functions 
      void setBool(const std::string &name, bool value) const; 

      void setInt(const std::string &name, int value) const; 

      void setFloat(const std::string &name, float value) const; 

      void setVec2(const std::string &name, const glm::vec2 &value) const; 

      void setVec2(const std::string &name, float x, float y) const; 

      void setVec3(const std::string &name, const glm::vec3 &value) const; 

      void setVec3(const std::string &name, float x, float y, float z) const; 

      void setVec4(const std::string &name, const glm::vec4 &value) const; 

      void setVec4(const std::string &name, float x, float y, float z, float w); 

      void setMat2(const std::string &name, const glm::mat2 &mat) const; 

      void setMat3(const std::string &name, const glm::mat3 &mat) const; 

      void setMat4(const std::string &name, const glm::mat4 &mat) const; 

     private: 
      // utility function for checking shader compilation/linking errors. 
      void checkCompileErrors(GLuint shader, std::string type); 
     }; 

struct FFB_FRAMEWORK_API Material 
     { 
      Shader shader; 
      std::vector<Texture> textures; 
     }; 
class FFB_FRAMEWORK_API Mesh 
     { 
     private: 
      std::vector<Vertex> m_vertices; 
      std::vector<unsigned int> m_indices; 
      Material m_material; 
      unsigned int VAO, VBO, EBO; 
      void SetupMesh(); 
     public: 
      Mesh(std::vector<Vertex> vertices, std::vector<unsigned int> indices, Material material); 
      void Draw(Shader shader); 
     }; 

Mesh.h

Mesh::Mesh(std::vector<Vertex> vertices, std::vector<unsigned int> indices, Material material) 
{ 
    m_vertices = vertices; 
    m_indices = indices; 
    m_material = material; 
    // now that we have all the required data, set the vertex buffers and its attribute pointers. 
    SetupMesh(); 
} 

コンパイラ文句直前m_verticies =頂点

重大度コード説明プロジェクトファイル行抑制状態エラー (アクティブ)E1790デフォルトのコンストラクタ "Framework :: Graphics :: Material"は参照できません - 削除された関数FFB_Framework c:\ Users \ User \ Documentsプロジェクト\ FFB \ FFB_Framework \ Mesh.cpp 7

編集\ \ Visual Studioの 2017。 私は

Mesh::Mesh(std::vector<Vertex> vertices, std::vector<unsigned int> indices, Material material):m_vertices(vertices),m_indices(indices),m_material(material) 
{SetupMesh();} 

コンパイラにコンストラクタを変更した場合はエラーがあることをスロー:

重大度コード説明プロジェクトファイルの行の抑制状態 エラーLNK2019未解決の外部シンボル「__declspec(dllimportの) 公共:__cdeclフレームワーク:: Graphics :: Material ::〜Material(void) " で参照されている (__imp _ ?? 1Material @ Graphics @ Framework @@ QEAA @ XZ)" public:__cdecl Framework :: Graphics :: Mesh :: Mesh(クラス std :: vector>、クラスグラフィックス::マテリアル) " (0Mesh @ Graphics @ Framework @@ QEAA @ V?$ vector @ UVertex @@ V?$ allocator @ UVertex @@@ std @std :: vector>、struct フレームワーク::グラフィックス::素材) FFB_Framework C:\ Users \ Anton \ Documents \ Visual スタジオ2017 \ Projects \ FFB \ FFB_Framework @@ std @@ V?$ vector @ IV?$ allocator @I @ std @@@ 4 @ UMaterial @ 12 @ \ Mesh.obj 1

重大度コード説明プロジェクトファイルの行の抑制状態 エラーLNK2019未解決の外部シンボル「__declspec(dllimportの) 公共:フレームワーク::グラフィックス::材料::材(構造体 フレームワーク::グラフィック__cdecl: :Material const &)で参照されている (__imp_ ?? 0Material @ Graphics @ Framework @@ QEAA @ AEBU012 @@ Z) ( std :: vector>、クラス std :: vector>、構造体 フレームワーク::グラフィックス::素材) " (?? 0Mesh @ 10関数" public:__cdecl Framework :: Graphics :: Mesh :: Meshグラフィックス@フレームワーク@@ QEAA @ V?$ベクトル@ UVertex @@ V?$アロケータ@ UVertex @@@ std @@@ std @@ V?$ベクトル@ IV?$アロケータ@I @ std @@@ 4 @ UMaterial @ 12 @@)FFB_Framework C:\ Users \ Anton \ Documents \ Visual スタジオ2017 \プロジェクト\ FFB \ FFB_Framework \ Mesh。obj 1

どこの人がエラーを知っていますか?

+0

推測 - 'Mesh :: Mesh'は' Material'を値(コピーを作成)とし、 'Shader shader;'( 'Material'のメンバー)はコピーできません。 'Shader'の定義は何ですか? –

答えて

0

m_material変数の割り当てを使用しています。 Meshコンストラクタの本文を入力する前に、m_materialのデフォルトコンストラクタが呼び出され、削除されます。このようにコンストラクタを再編成し、マテリアルに一致するコンストラクタを提供することができます

Mesh :: Mesh(std :: vectorインデックス、std ::ベクトルインデックス、マテリアルマテリアル):m_vertices(頂点)、m_indices(インデックス)、m_material (材料) { //すべての必要なデータがあるので、頂点バッファとその属性ポインタを設定します。 SetupMesh(); }

関連する問題