0

I have the following compiler error, how could I fix it?

error: instantiated from `_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = ar, _Tp = int, _Compare = std::less<ar>, _Alloc = std::allocator<std::pair<const ar, int> >]' 

This is the code:

#include <map>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstdlib>
using namespace std; 
class ar { 
 public:
 int a;
 int b;
 int c;
public:
 ar() : a(0), b(0), c(0) {}
};
int main() {
 map<ar, int> mapa;
 ar k;
 k.a = 6;
 k.b = 1;
 k.c = 0;
 mapa[k] = 1;
 //system("pause");
 return 0;
 }
Marius Bancila
16.4k9 gold badges53 silver badges97 bronze badges
asked Feb 19, 2013 at 21:27
2
  • First step toward fixing your programming errors: use reasonable indentation and variable names. Commented Feb 19, 2013 at 21:32
  • Relevant: stackoverflow.com/questions/6573225/… Commented Feb 19, 2013 at 21:35

3 Answers 3

1

For a std::map you need to have overloaded operator< on the Key type of the map, because that is how the map will insert elements into it's underlying container.

class ar { 
 public:
 int a;
 int b;
 int c;
 public:
 ar() : a(0), b(0), c(0) {}
 bool operator<(const ar& other) const;
 };
bool ar::operator< (const ar& other) const // note the function has to be const!!!
{
 return (other.a < a) && (other.b < b) && (other.c < c); // or some such ordering
}

When overloading operator<, it's a good idea to in a similar fashion also overload operator>.

answered Feb 19, 2013 at 21:33

2 Comments

i am still getting the same error. could it be another problem?
the operator< has to be const function. Then it works
1

You need a comparison function for the map. You can either create operator< that compares two instances of ar, or you can create a custom function and pass it as the 3rd template parameter.

An example of the former might be:

class ar {
 ...
 bool operator<(const ar& rhs) const {
 return std::tie(a,b,c) < std::tie(rhs.a, rhs.b, rhs.c);
 }
 ...
};
answered Feb 19, 2013 at 21:33

6 Comments

why is it important to have comparison function in this case? my only wish in this case is that my class represent an index for map.
@user2085124 because the map orders it's elements in it's underlying container, and if it doesn't know how to order them, it can't do it. It relies on some Comparison function being present in it's Key type.
i am still getting the same error. could it be another problem?
@user2085124 - There was an error in my code, which I have fixed in my answer. Notice the change in function signature to const. Now it works for me.
why is it has to be const?
|
0

operator < must be available for the key type, or you should provide a comparison functor to the map constructor.

answered Feb 19, 2013 at 21:35

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.