C++ 常量不匹配:2个重载对';这';指针

C++ 常量不匹配:2个重载对';这';指针,c++,vector,constants,this-pointer,C++,Vector,Constants,This Pointer,我得到了一个奇怪的错误: 错误C2663: “sf::Drawable::SetPosition”:2 重载没有合法的转换 “this”指针 我认为这与常量不匹配有关,但我不知道在哪里,或者为什么。 在下面的代码中,我有一个形状和精灵的向量,当尝试访问其中一个形状向量并调用它的函数时,我得到了错误 std::vector<sf::Shape> Shapes; std::vector<sf::Sprite> Sprites; bool AddShape(sf::Shape

我得到了一个奇怪的错误:

错误C2663: “sf::Drawable::SetPosition”:2 重载没有合法的转换 “this”指针

我认为这与常量不匹配有关,但我不知道在哪里,或者为什么。 在下面的代码中,我有一个形状和精灵的向量,当尝试访问其中一个形状向量并调用它的函数时,我得到了错误

std::vector<sf::Shape> Shapes;
std::vector<sf::Sprite> Sprites;

bool AddShape(sf::Shape& S){
    Shapes.push_back(S); return true;
};
bool AddSprite(sf::Sprite& S){
    Sprites.push_back(S); return true;
};

private:

virtual void Render(sf::RenderTarget& target) const {                
    for(unsigned short I; I<Shapes.size(); I++){
        Shapes[I].SetPosition(
            Shapes[I].GetPosition().x + GetPosition().x,
            Shapes[I].GetPosition().y + GetPosition().y);
        target.Draw(Shapes[I]);
    }
    for(unsigned short I; I<Sprites.size(); I++){
        target.Draw(Sprites[I]);
    }
}
std::向量形状;
矢量精灵;
bool AddShape(sf::Shape&S){
形状。推回;返回true;
};
bool AddSprite(sf::Sprite&S){
精灵。向后推_;返回true;
};
私人:
虚拟空渲染(sf::RenderTarget&target)常量{

对于(无符号短I;I
Render
在参数后用一个
const
声明。这意味着它不会更改其对象。这意味着,对象的所有成员变量都被视为
Render
中的常量,因为更改它们的状态意味着更改包含的对象。假设
Shapes
是成员变量,并且
SetPosition
确实会更改形状(即未声明为
const
),则不能在
const
成员函数中调用它


因此,从
Render
中删除
const
,您就没事了(您可以修复逻辑,以防它必须是const).

他不能删除常量;他是从一个基类派生出来的,这个基类大概是从这个常量开始的。@Nicol Bolas,你怎么知道?OP没有说任何关于包含
Render
的类的内容,是吗?如果他这么做了,而我错过了,他只需要更改
Render
的内容。你不能更改
const
member函数中的成员变量(除非您想破解自己的代码,并让用户感到惊讶).@Nicol Bolas,嗯,我不知道……但我的观点仍然站得住脚——他应该改变他的实现。这实际上是有道理的——为什么渲染一个对象会改变它的状态?为了确认他继承的基类,渲染不应该改变对象的状态。如果我不深入研究实现,一个可能的解决方案tion可以声明形状的局部向量,该向量将被设置并传递给
Draw
。这可能不是很有效,但它将解决常量不匹配问题(允许在常量成员函数中更改局部变量)。显然这不明显。