2017-12-28 115 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 = 정점

,536,913,632 10

심각도 코드 설명 프로젝트 파일 줄 억제 상태 오류 (활성) E1790 의 기본 생성자 "Framework :: Graphics :: Material"을 참조 할 수 없습니다. 삭제 된 함수입니다. FFB_Framework c : \ Users \ User \ Documents \ Visual Studio 2017 \ Projects \ FFB \ FFB_Framework \ Mesh.cpp 7

편집 됨. 내가

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>, 클래스프레임 : Graphics :: Material) " (그래픽 프레임 워크 @@ QEAA @VEAV @@ UVertex @@ V? $ allocator @ UVertex @@@ std @std :: vector>, 구조체 ) @@ std @@ V? $ vector @ IV? $ allocator @I @ std @@@ 4 @ UMaterial @ 12 @@ Z) FFB_Framework C : \ Users \ Anton \ Documents \ Visual Studio 2017 \ Projects \ FFB \ FFB_Framework \ Mesh.obj 1

심각도 코드 설명 프로젝트 파일 라인 억제 상태 오류 LNK2019 확인되지 않은 외부 기호 "__declspec (같이 DllImport) 공공 : 프레임 워크 : 그래픽 :: 재료 :: 재료 (구조체 프레임 워크 : 그래픽 __cdecl : : Material const &)에서 참조 된 (__imp _ ?? 0Material @ Graphics @ Framework @@ QEAA @ AEBU012 @@ Z) 10 함수 "public : __cdecl Framework :: Graphics :: Mesh :: 메쉬 (클래스 std :: vector>, 클래스 std :: vector>, 구조체 프레임 워크 :: 그래픽 :: 재질)" (?? 0Mesh @ 그래픽 @ 프레임 워크 @@ QEAA @ V? $ 벡터 @ UVertex @@ V? $ 할당 자 @ UVertex @@@ std @@@ std @@ V? $ vector @ IV? $ allocator @ I @ std @@@ 4 @ UMaterial @ 12 @@ Z) FFB_Framework C : \ Users \ Anton \ Documents \ Visual Studio 2017 \ Projects \ FFB \ FFB_Framework \ Mesh.obj 1

어디에서 오류를 알 수 있습니까?

+0

추측 - 'Mesh :: Mesh'는 값으로'재료 '를 사용하고 (복사하기)'셰이더 셰이더 '('재료 '의 멤버)는 복사 할 수 없습니다. Shader의 정의는 무엇입니까? –

답변

0

m_material 변수에 대한 지정을 사용 중입니다. Mesh 생성자의 본문을 입력하기 전에 m_material의 기본 생성자가 호출되어 삭제됩니다. 이와 같이 생성자를 재구성하고 재질에 일치하는 생성자를 제공 할 수 있습니다.

메쉬 :: 메쉬 (표준 : 벡터 정점, 벡터 :: 벡터 인덱스, 재질 재료) : m_vertices (정점), m_ 인덱스 (색인), m_material (material) { // 우리가 필요한 모든 데이터를 갖기 때문에 버텍스 버퍼와 그 속성 포인터를 설정하십시오. SetupMesh(); }