Константные несоответствия: 2 перегрузки не имеют допустимого преобразования для указателя this.

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

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

Как это исправить?


person Griffin    schedule 10.07.2011    source источник
comment
Очевидно, это не очевидно.   -  person applesoup    schedule 21.08.2018


Ответы (1)


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

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

person eran    schedule 10.07.2011
comment
Он не может удалить константу; он происходит от базового класса, который предположительно поместил туда эту константу для начала. - person Nicol Bolas; 10.07.2011
comment
@ Никол Болас, откуда ты знаешь? ОП ничего не говорит о классе, который содержит Render, не так ли? И если он это сделает, а я это пропустил, ему просто нужно будет изменить содержимое Render. Вы не можете изменять переменные-члены внутри функции-члена const (если только вы не хотите взломать свой собственный код и удивить его пользователей). - person eran; 10.07.2011
comment
@ Никол Болас, ну, я этого не знал ... Но моя точка зрения остается в силе - он должен изменить свою реализацию. На самом деле это имеет смысл — почему рендеринг объекта меняет его состояние? Чтобы подтвердить базовый класс, который он унаследовал, рендеринг не должен изменять состояние объекта. Без моего глубокого погружения в реализацию возможным решением может быть объявление локального вектора Shapes, который будет установлен и передан в Draw. это может быть неэффективно, но это устранит несоответствие const (локальные переменные разрешено изменять в константных функциях-членах). - person eran; 10.07.2011