C++ C++;错误C2511:在';雪碧&x27;

C++ C++;错误C2511:在';雪碧&x27;,c++,inheritance,overloading,C++,Inheritance,Overloading,我有一个名为Renderable2D的基类: class Renderer; class Renderable2D { protected: vec3f m_Position; vec2f m_Size; unsigned int m_Color; protected: Renderable2D() { } Renderable2D(vec3f position, vec2f size) : m_Position(position),

我有一个名为
Renderable2D
的基类:

class Renderer;

class Renderable2D
{
protected:
    vec3f m_Position;
    vec2f m_Size;
    unsigned int m_Color;

protected:
    Renderable2D() { }

    Renderable2D(vec3f position, vec2f size)
        : m_Position(position), m_Size(size), m_Color(0xffffffff)
    {
    }

public:
    virtual ~Renderable2D()
    { }

    virtual void Submit(Renderer * renderer) const;

    inline const vec3f& GetPosition() const { return m_Position; }
    inline const vec2f& GetSize() const { return m_Size; }
    inline unsigned int GetColor() const { return m_Color; }
};
我必须在cpp文件中定义的唯一一件事是
Submit
方法,以避免循环包含:

#include "Renderable2D.h"
#include "../renderers/Renderer2D.h"
inline void Renderable2D::Submit(Renderer * renderer) const
{
    renderer->Submit(*this);
}
然后我从
Renderable2D
派生了一个名为
Sprite
的类:

#include "Renderable2D.h"

class Sprite : public Renderable2D
{
protected:
    GLuint m_TextureID;

public:
    Sprite(const vec2f& position, const vec2f& size, const Texture2D * texture);

    void Submit(Renderer * renderer) const override;

    inline const GLuint GetTextureID() const { return m_TextureID; }
};
在cpp文件中,我只定义了构造函数和重写的
Submit
方法:

#include "Sprite.h"
#include "../renderers/Renderer2D.h"

Sprite::Sprite(const vec2f& position, const vec2f& size, const Texture2D * texture)
    : Renderable2D(vec3f(position.x, position.y, 0), size)
{
    m_TextureID = texture->GetTextureID();
}

inline void Sprite::Submit(Renderer * renderer) const
{  // ERROR HERE
    renderer->Submit(*this);
}
当我尝试编译时,得到错误C2511,在“Sprite”中找不到重载的成员函数。我不明白为什么。签名错了吗

编辑:这里是renderer类,它只是所有渲染器的基类

class Renderable2D;
class Rectangle2D;
class Label;
class Sprite;

class Renderer2D
{
protected:
    std::vector<Maths::mat4f> m_TransformationStack;
    const Maths::mat4f * m_TransformationBack;

protected:
    Renderer2D()
    {
        m_TransformationStack.push_back(Maths::mat4f::identity());
        m_TransformationBack = &m_TransformationStack.back();
    }

public:
    inline void Push(const Maths::mat4f& matrix)
    {
        m_TransformationStack.push_back(matrix * m_TransformationStack.back());
        m_TransformationBack = &matrix;
    }

    inline void PushOverride(const Maths::mat4f& matrix)
    {
        m_TransformationStack.push_back(matrix);
        m_TransformationBack = &matrix;
    }

    void Pop()
    {
        if (m_TransformationStack.size() > 1)
            m_TransformationStack.pop_back();
        else
            Logging::Logger::Log(Logging::LogERROR, "Can't pop the first entry of the transformation stack!");

        m_TransformationBack = &m_TransformationStack.back();
    }

    virtual void Begin() {}
    virtual void End() {}

    virtual void Submit(const Renderable2D& renderable) = 0;
    virtual void Submit(const Label& label) = 0;
    virtual void Submit(const Rectangle2D& rect) = 0;
    virtual void Submit(const Sprite& spr) = 0;

    virtual void Flush() = 0;
};
classrenderable2d;
类矩形2D;
类别标签;
雪碧类;
类渲染器2D
{
受保护的:
std::向量m_变换堆栈;
常量数学::mat4f*m_变换返回;
受保护的:
渲染器2D()
{
m_TransformationStack.push_back(数学::mat4f::identity());
m_TransformationBack=&m_TransformationStack.back();
}
公众:
内联无效推送(常量数学::mat4f和矩阵)
{
m_TransformationStack.push_back(矩阵*m_TransformationStack.back());
m_TransformationBack=&matrix;
}
内联无效PushOverride(常量数学::mat4f和矩阵)
{
m_变换堆栈。推回(矩阵);
m_TransformationBack=&matrix;
}
void Pop()
{
if(m_TransformationStack.size()>1)
m_TransformationStack.pop_back();
其他的
Logging::Logger::Log(Logging::LogERROR,“无法弹出转换堆栈的第一个条目!”);
m_TransformationBack=&m_TransformationStack.back();
}
虚拟void Begin(){}
虚拟void End(){}
虚拟void提交(const Renderable2D&renderable)=0;
虚拟无效提交(常量标签和标签)=0;
虚拟无效提交(常量矩形2D&rect)=0;
虚拟无效提交(常量精灵和spr)=0;
虚空刷新()=0;
};
下面是唯一扩展此类的渲染器的标题:

#include "Renderer2D.h"

class Batch2DRenderer : public Renderer2D
{
private:
    GLuint m_VAO;
    IndexBuffer * m_IBO;
    GLsizei m_IndexCount;
    GLuint m_VBO;
    VertexData * m_Buffer;
    std::vector<GLuint> m_TextureSlots;

public:
    Batch2DRenderer();
    ~Batch2DRenderer();

    void Begin() override;
    void End() override;

    void Submit(const Renderable2D& renderable) override;
    void Submit(const Label& label) override;
    void Submit(const Rectangle2D& rect) override;
    void Submit(const Sprite& spr) override;

    void Flush() override;

private:
    void init();
    float SubmitTexture(GLuint textureID);
};
#包括“Renderer2D.h”
类Batch2DRenderer:PublicRenderr2D
{
私人:
GLuint m_VAO;
IndexBuffer*m_IBO;
GLsizei m_IndexCount;
GLuint m_VBO;
VertexData*m_缓冲区;
std::向量m_纹理图;
公众:
Batch2DRenderer();
~Batch2DRenderer();
void Begin()覆盖;
void End()覆盖;
无效提交(const Renderable2D和renderable)覆盖;
无效提交(常量标签和标签)覆盖;
无效提交(常量矩形2D和矩形)覆盖;
无效提交(常量精灵和spr)覆盖;
无效刷新()覆盖;
私人:
void init();
浮动提交结构(GLuint textureID);
};

实现文件非常大,但如果需要,我也可以提供。我想这个错误很容易引起误解,因为我想这里还有其他问题。

可能是这个问题导致使用内联函数。阅读本文,它可以帮助您。

使用内联函数可能会导致此问题。阅读这篇文章可以帮助你。

好的,我会编辑我的文章。我猜VisualStudio因为某种循环依赖性而变得疯狂…它工作了吗?因为对我来说,我第一次遇到一个链接错误,但是在删除单词inline之后,它起了作用。我没有遇到您遇到的错误,尽管在我拥有Renderable2D子类之前,这段代码工作得很好,并且重载了Renderer和Batch2DRenderer的Submit()方法。如果有人慷慨地检查它,我甚至可以链接存储库(这是一个Visual Studio项目)尝试剥离项目中与给出错误的函数(
Submit
)无关的所有代码,然后查看错误是否仍然存在。由于这是在一些代码移动之后开始的,所以它可能是一个缺少的或不正确的括号或分号。好的,我将编辑我的文章。我猜VisualStudio因为某种循环依赖性而变得疯狂…它工作了吗?因为对我来说,我第一次遇到一个链接错误,但是在删除单词inline之后,它起了作用。我没有遇到您遇到的错误,尽管在我拥有Renderable2D子类之前,这段代码工作得很好,并且重载了Renderer和Batch2DRenderer的Submit()方法。如果有人慷慨地检查它,我甚至可以链接存储库(这是一个Visual Studio项目)尝试剥离项目中与给出错误的函数(
Submit
)无关的所有代码,然后查看错误是否仍然存在。因为这是在一些代码移动之后开始的,所以它可能是一个缺失的或游离的括号或某种分号。