【问题标题】:The default constructor of "Framework::Graphics::Material" cannot be referenced -- it is a deleted function“Framework::Graphics::Material”的默认构造函数不能被引用——它是一个被删除的函数
【发布时间】:2018-06-09 00:37:01
【问题描述】:

已编辑:添加了 Shader 类。

我正在编写一个 DLL 库,但 MS VS intellisense 和编译器抱怨 Mesh 构造函数。如果我将 Mesh 构造函数中的 Material 属性更改为 Texture 都可以。我试图将结构更改为类,但它不起作用。删除 FFB_FRAMEWORK_API 宏也不起作用。

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 = vertices 之前抱怨

严重性代码描述项目文件行抑制状态错误 (active) 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 Framework::Graphics::Material::~Material(void)" (__imp_??1Material@Graphics@Framework@@QEAA@XZ) 在函数中引用 “公共:__cdecl 框架::图形::网格::网格(类 标准::向量>,类 标准::向量>,结构 框架::图形::材料)" (??0Mesh@Graphics@Framework@@QEAA@V?$vector@UVertex@@V?$allocator@UVertex@@@std@@@std@@V?$vector@IV?$allocator@I@std@ @@4@UMaterial@12@@Z) FFB_Framework C:\Users\Anton\Documents\Visual 工作室 2017\Projects\FFB\FFB_Framework\Mesh.obj 1

严重性代码描述项目文件行抑制状态 错误 LNK2019 未解析的外部符号“__declspec(dllimport) 公共:__cdecl Framework::Graphics::Material::Material(struct Framework::Graphics::Material const &)" (__imp_??0Material@Graphics@Framework@@QEAA@AEBU012@@Z) 中引用 函数“公共:__cdecl Framework::Graphics::Mesh::Mesh(class 标准::向量>,类 标准::向量>,结构 框架::图形::材料)" (??0Mesh@Graphics@Framework@@QEAA@V?$vector@UVertex@@V?$allocator@UVertex@@@std@@@std@@V?$vector@IV?$allocator@I@std@ @@4@UMaterial@12@@Z) FFB_Framework C:\Users\Anton\Documents\Visual 工作室 2017\Projects\FFB\FFB_Framework\Mesh.obj 1

有谁知道哪里出错了?

【问题讨论】:

  • Guess - Mesh::Mesh 按值获取 Material(复制)和 Shader shader;Material 的成员)不可复制。 Shader的定义是什么?

标签: c++ visual-studio dll struct constructor


【解决方案1】:

您正在为m_material 变量使用赋值。在进入 Mesh 构造函数的主体之前,调用了 m_material 的默认构造函数,将其删除。您可以像这样重新组织构造函数并为 Material 提供匹配的构造函数

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

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 2014-05-09
    • 2022-01-22
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多