Ваш тип point
не поддерживает слабый порядок. У него нет метода определения «меньше». Вы можете подумать, что вам это не нужно, потому что ваш point
фактически заправлен в std::pair<point,point>
, но вы делаете.
std::pair<T1,T2>
поддерживает слабый порядок, только если T1
и T2
делают. В вашем случае они одного типа, поэтому для использования std::pair<point,point>
в качестве ключа std::map<std::pair<point,pint>,T>
, point
должен поддерживать слабый порядок.
Для поддержки слабого порядка вы должны либо предоставьте operator<
, который сравнивает два ваших рассматриваемых объекта, или тип функтора компаратора, который делает то же самое. Самый простой способ сделать это:
#include <tuple>
struct point
{
int x;
int y;
bool operator <(const point& p) const
{
return std::tie(x, y) < std::tie(p.x, p.y);
}
bool operator ==(const point& p) const
{
return !(*this < p || p < *this);
}
bool operator !=(const point& p) const
{
return *this < p || p < *this;
}
};
Я позволил себе переопределить operator ==
и operator !=
, чтобы использовать свойства слабого порядка соответствующих operator <
. В этом не было необходимости, но в конечном итоге просто, если операторы root набирают код c, насколько это возможно. С учетом вышеуказанных изменений вы сможете использовать как point
и std::pair<point,point>
в качестве типов ключей в std::map
и std::set
. По правде говоря, строгий слабый порядок может определять все базовых c компараторов (<=,>,> =,! =, ==) как производные от operator <
в той или иной форме ( или относительно того, что делает). Я призываю вас рассмотреть их, попробовать реализовать их и, прежде всего, написать несколько тестовых наборов, которые проверяют вашу реализацию.