Ошибка вставки std :: map: нет оператора & quot; & lt; & quot; соответствует этим операндам

Пытаюсь освежить свои знания C ++ и STL, столкнулся с проблемой с std :: map, основанной на структуре, которую я определил. Соответствующий код:

typedef struct key_t {
int a;
int b;
bool operator==(const key_t& rhs)
{
return (a == rhs.a) && (b == rhs.b);
}
bool operator<(const key_t& rhs) //added the when I saw this error, didn't help
{
return a < rhs.a;
}
} key_t;

std::map<key_t, int> fooMap;

void func(void)
{
key_t key;
key.a = 1;
key.b = 2;

fooMap.insert(std::pair<key_t, int>(key, 100));
}

Ошибка выглядит так:

"/opt/[redacted]/include/functional", line 133: error: no operator "<" matches these operands
operand types are: const key_t < const key_t
detected during:
instantiation of "bool std::less<_Ty>::operator()(const _Ty &, const _Ty &) const [with _Ty=key_t]" at line 547 of "/opt/[redacted]/include/xtree"instantiation of "std::_Tree<_Traits>::_Pairib std::_Tree<_Traits>::insert(const std::_Tree<_Traits>::value_type &) [with _Traits=std::_Tmap_traits<key_t, UI32, std::less<key_t>, std::allocator<std::pair<const key_t, UI32>>, false>]"

Что я делаю неправильно? Это просто ужасно / невозможно использовать структуры в качестве ключа карты? Или что-то еще я пропускаю?

4

Решение

это

 bool operator<(const key_t& rhs)

должен быть метод const

 bool operator<(const key_t& rhs) const

Два разных подписей, и std::less ищет последнее. Последний, как метод const, подразумевает, что он не будет изменять объект. Первое, однако, без констант может означать, что изменение this может быть выполнено.

В общем, хорошая идея иметь const методы, даже если вы можете от них отказаться, это обещает клиенту, что никаких изменений не произойдет.

5

Другие решения

Для начала операторы должны быть const, (И вам не нужно == оператор).

И где вы научились использовать typedef для struct, Там нет причин для этого.

И, наконец, если вы хотите, чтобы оба элемента участвовали как часть
ключ, вы должны сравнить их оба:

struct Key
{
int a;
int b;
bool operator<( Key const& rhs ) const
{
return a < rhs.a
|| ( !(rhs.a < a) && b < rhs.b );
}
};

Иначе, Key( 1, 2 ) а также Key( 1, 3 ) будет эффективно
равны.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector