web-dev-qa-db-ja.com

constの不一致:2つのオーバーロードには「this」ポインターの正当な変換がありません

この奇妙なエラーが発生します:

エラーC2663: 'sf :: Drawable :: SetPosition':2つのオーバーロードには 'this'ポインタの正当な変換がありません

Constの不一致と関係があると思いますが、どこで、なぜかわかりません。次のコードでは、形状とスプライトのベクトルがあり、ベクトルの形状の1つにアクセスしてその関数のいずれかを呼び出そうとすると、エラーが発生します。

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

これを修正するにはどうすればよいですか?

19
Griffin

Renderは、パラメーターの後にconstを付けて宣言されます。これは、オブジェクトを変更しないことを意味します。つまり、オブジェクトのすべてのメンバー変数はRender内の定数と見なされます。これは、それらの状態を変更すると、含まれているオブジェクトが変更されるためです。 Shapesがメンバー変数であり、SetPositionが形状を変更すると(つまり、constとして宣言されていない)、constメンバー内で呼び出すことはできません。関数。

したがって、constRenderから削除すれば、問題はありません(constである必要がある場合は、ロジックを修正します)。

24
eran