Синтаксическая ошибка в том, что set<tile>::find
ожидает другого tile
, а не int
.В C ++ 14 добавлены новые перегрузки, которые позволяют выполнять поиск по другому типу, см. ref .Этот источник также говорит, что для их включения компаратор set
должен быть прозрачным .Компаратором по умолчанию является std::less<tile>
, который, насколько мне известно, явно не считается прозрачным.Поэтому решение состоит в том, чтобы определить пользовательский компаратор:
struct comp
{
public:
using is_transparent = void;//Can be anything, just needs to be defined.
constexpr bool operator()(const tile &lhs, const tile &rhs) const
{
return lhs < rhs;//You should reimplement to create proper ordering.
}
constexpr bool operator()(const tile &lhs, int ID) const
{
return lhs.ID < ID;//You should reimplement to create proper ordering.
}
constexpr bool operator()(int ID, const tile &rhs) const
{
return ID < rhs.ID;//You should reimplement to create proper ordering.
}
};
#include <set>
int main() {
std::string buffer = "a s d f ";
std::cout << "Before " << buffer << std::endl;
std::set<tile, comp> set;
set.find(0);//Should compile and find the tile with zero ID
}
Примечание компаратор должен создать такой же слабый порядок для всех перегрузок вработать правильно.Ваша реализация operator<
этого не делает, потому что, как указал @Alexander в своем ответе, ваши плитки не сортируются по идентификаторам.
РЕДАКТИРОВАТЬ: так что не используйте комп как он есть сейчас, вы должны изменитьреализация для правильного создания заказа.