Несоответствия констант: 2 перегрузки не имеют легального преобразования для указателя 'this' - PullRequest
17 голосов
/ 10 июля 2011

Я получаю эту странную ошибку:

ошибка 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]);
    }
}

Как я могу это исправить?

1 Ответ

23 голосов
/ 10 июля 2011

Render объявляется с const после параметров. Это означает, что он не меняет свой объект. Это означает, что все переменные-члены объекта считаются константами в пределах Render, так как изменение их состояния означает изменение содержащего объекта. Предполагая, что Shapes является переменной-членом, и что SetPosition действительно изменяет форму (то есть не объявлено как const), вы не можете вызвать ее в const функции-члене.

Итак, удалите const из Render, и все будет в порядке (исправьте свою логику на случай, если она должна быть константной).

...