Markus-Hermann
Markus-Hermann

Reputation: 969

'operator<' error while creating an std::pair<A,B>

I already have a workaround for this but would still like to understand the problem.

I have a Multimap

multimap<QPoint,Figure*> mymap;

QPoint is a class from Qt 5.4. Figure* is a pointer to a class I have concocted myself.

Now I want to add elements to that map.

This sample works fine:

multimap<int,int> test;
test.insert(pair<int,int>(41,43));

As does this one (being said workaround)

std::pair<QPoint,Figure*> p;
p.first = pos;
p.second =  sub_fig;
mymap.insert(p);

However, the plain first reflex of

std::pair<QPoint,Figure*> p(pos, sub_fig);

has the compiler at that line state something like:

[..]
scanner.cpp:264:17:   required from here
/usr/include/c++/4.9/bits/stl_function.h:371:20: error: no match for
‘operator<’ (operand types are ‘const QPoint’ and ‘const QPoint’)
  { return __x < __y; }
[..]

followed by the usual five kilometers of stacked STL error messages. First: The 'types' are not QPoint and QPoint. They are, as stated above, QPoint and Figure*.

Anyone who can riddle this?

CORRECTION

My work-around does not work either after all. I had forgotten to de-comment res.insert(p);

Here is the complete pertinent code:

multimap<QPoint,Figure*> res;
// ...
vector<Figure*> stack = figure->get_above_figure_stack();
  for (vector<Figure*>::const_iterator CI2=stack.begin();
    CI2!=stack.end();CI2++)
  {
    // ..
    Figure* sub_fig = *CI2;
    std::pair<QPoint,Figure*> p;
    p.first = pos;
    p.second =  sub_fig;
    res.insert(p); // <- The bad line.
  }

Upvotes: 0

Views: 680

Answers (2)

molbdnilo
molbdnilo

Reputation: 66371

multimap needs an ordering relation for the keys, and its default is to use < (in the guise of std::less).

Since QPoint doesn't have an overload of operator<, the compiler is complaining that it doesn't exist.

It's not difficult to provide one:

bool operator< (const QPoint& lhs, const QPoint& rhs)
{
    return lhs.x() < rhs.x() || (lhs.x() == rhs.x() && lhs.y() < rhs.y());
}

or

bool lessQPoints (const QPoint& lhs, const QPoint& rhs)
{
    return lhs.x() < rhs.x() || (lhs.x() == rhs.x() && lhs.y() < rhs.y());
}

multimap<QPoint, Figure*, lessQPoints> mymap;

Upvotes: 2

acraig5075
acraig5075

Reputation: 10756

The keys in a multimap are ordered by default with std::less which invokes operator< on the key type.

Your key object (QPoint) has no operator< to do the comparison.

You will need to provide your own comparison function using the approprate multimap constructor.

Upvotes: 2

Related Questions