実現したいこと
listのsortをしようとするとエラーが出る
これの対処法
前提
listを知ったばかりです。よろしくお願いします
発生している問題・エラーメッセージ
E1087 オーバーロードされた関数 "std::list<_Ty, _Alloc>::sort [代入_Ty=Maker *, _Alloc=std::allocator<Maker *>]" のインスタンスが引数リストおよびオブジェクトと一致しません (オブジェクトに一致を妨げる型修飾子があります)
該当のソースコード
C++ class Maker { Float2 _pos = { 0.0f, 0.0f }; //座標 static const float _RAD; //半径 int _id = 0; bool _capture = false; const Font _font{ FontMethod::MSDF, 32 }; public: Maker() = default; Maker(const Float2& pos) : _pos(pos) {} virtual ~Maker() = default; virtual void Draw()const { //捕まえられた時の色 if (_capture) { Circle(_pos, _RAD).draw(Palette::Gray); } //捕まえられそうな時の色 else if (Circle(_pos, _RAD).mouseOver()) { Circle(_pos, _RAD).draw(Palette::Lightgrey); } //平和な時の色 else { Circle(_pos, _RAD).drawFrame(); } _font(U"{}"_fmt(_id)).drawAt(_pos); } bool IsHit() { return Circle(_pos, _RAD).mouseOver(); //円上にカーソルがあるかを返す } bool IsHit(const Float2& position)const { return _pos.distanceFromSq(position) <= _RAD * _RAD; } const Float2& GetPos()const { return _pos; } int GetId()const { return _id; } const bool& GetCapture()const { return _capture; } Circle GetCircle()const { return Circle(_pos, _RAD);} void SetPos(Float2 pos) { _pos = pos; } void SetId(int id) { _id = id; } void SetCapture(const bool& capture) { _capture = capture; } bool operator<(const Maker& r)const { return _id < r._id; } float LengthSq(float x, float y)const { float vx = x - _pos.x; float vy = y - _pos.y; return vx * vx + vy * vy; } };
#include <list> #include <algorithm> #include "maker.h" #include "maker_special.h" #include "rectangle_selecter.h" class MakerManager { std::list<Maker*> _makers; //マーカーたち Maker* _capture = nullptr; public: MakerManager() { _makers.push_back(new SpecialMaker()); } ~MakerManager() { //リストの中身を全部消す for (auto makers : _makers) { delete makers; } } void Add(Maker* maker) { //リストにマーカーを加える _makers.push_back(maker); } //画面上の円を捕まえる bool Capture(const Float2& position) { //当たってたらキャッチ auto it = std::find_if(_makers.begin(), _makers.end(), [position](const Maker* p) { return p->IsHit(position); }); if (it == _makers.end()) { return false; } _capture = (*it); return true; } //捕まえた円を動かす void MoveCapture(const Float2& position) { if (!_capture) { return; } //キャッチした円がついていく _capture->SetCapture(true); _capture->SetPos(position); } //捕まえた円を離す void Release() { if (!_capture) { return; } _capture->SetCapture(false); _capture = nullptr; } //便利な方使った版 void Remove() { _makers.remove_if( [](Maker* m) { if (m->IsHit()) { delete m; return true; } return false; } ); } //マウスのポジションから void Remove(const Float2& position) { _makers.remove_if( [position](const Maker* m) { if (m->IsHit(position)) { delete m; return true; } return false; } ); } void Draw()const { //赤いマーカーに近い順番にソート Float2 pos =_makers.front()->GetPos(); _makers.sort(compareMakers); //ここのsortの部分に赤いうにょうにょです int count = 0; //リストにたまったマーカーのDrawを呼ぶ for (auto makers : _makers) { makers->SetId(count++); makers->Draw(); } } }; bool compareMakers(const Maker* a, const Maker* b) { return *a < *b; // Maker クラスの operator< を使用 }
試したこと
_makers.と打ったときにsortが候補にも出てこないじょうたいです。
どう対処したらいいかもわかりません。
他のプロジェクトではlist.sortは出来ました
補足情報(FW/ツールのバージョンなど)
Siv3D
VisualStadio2022
C++20
です
0 コメント