Std :: error inserting map: operator "<" does not match these operands

Trying to figure out my C ++ and STL skills when running into a problem with std :: map based on the structure I defined. Relevant Code:

 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)); } 

The error looks like this:

 "/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>]" 

What am I doing wrong? Is it just flat or impossible to use structures as a card key? Or something else I do not notice?

+4
source share
2 answers

it

  bool operator<(const key_t& rhs) 

there must be a const method

  bool operator<(const key_t& rhs) const 

Two different signatures, and std::less last. The latter, like the const method, implies that it will not modify the object. The first, but without const, can mean that a modification of this can be done.

In general, it’s nice to have const methods, even if you can refuse it, this means that the client can promise that there will be no changes.

+5
source

First, the operators must be const . (And you do not need the == operator.)

And where did you learn to use typedef for struct . There is no reason for this.

And finally, if you want both elements to participate as part of a key, you will have to compare both of them:

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

Otherwise, Key( 1, 2 ) and Key( 1, 3 ) will be effectively equal.

+1
source

Source: https://habr.com/ru/post/1447315/


All Articles