常量不匹配:2个重载没有合法的转换“this”指针。

25

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

error C2663: 'sf::Drawable::SetPosition' : 2个重载函数没有合法的转换 'this'指针

我想这可能与const不匹配有关,但我不知道出错的原因和位置。在下面的代码中,我有一个形状和精灵的向量,在尝试访问其中一个向量的形状并调用其函数时出现了错误。

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

如何修复这个问题?


2
显然这并不明显。 - applesoup
1个回答

35
在参数后面使用 const 声明的 Render 表示它不会改变其对象,也就是说,在 Render 中,所有对象的成员变量都被视为常量,因为改变它们的状态就意味着改变了包含它们的对象。假设 Shapes 是一个成员变量,并且 SetPosition 改变了形状(即未声明为 const),则无法在 const 成员函数中调用它。
因此,从 Render 中移除 const,你就可以正常调用它了(如果必须是 const,那么需要修正逻辑)。

他无法移除const;他正在从一个基类派生,该基类最初可能就将该const放在那里。 - Nicol Bolas
@Nicol Bolas,你怎么知道的?OP没有提到包含“Render”的类,对吧?如果他确实这样做了而我错过了,那他只需更改“Render”的内容即可。您无法在const成员函数内更改成员变量(除非您想要黑客自己的代码并惊讶其用户)。 - Eran
1
@Nicol Bolas,嗯,我不知道...但我的观点仍然存在-他应该改变他的实现。这实际上是有道理的-为什么渲染一个对象会改变它的状态?为了符合他继承的基类,渲染不应该改变对象的状态。在我深入研究实现之前,可能的解决方案是声明一个形状的本地向量,它将被设置并传递给“Draw”。那可能不是高效的,但它将解决const不匹配(局部变量允许在const成员函数中更改)。 - Eran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接