Это моя реализация класса Box:
class Box {
friend ostream& operator<<(ostream &os, const Box &b);
friend bool operator<(const Box &left, const Box &right);
public:
Box(int i, double d);
~Box();
private:
int i;
double d;
};
Box::Box(int _i, double _d):i(_i), d(_d) {}
Box::~Box() {}
bool operator<(const Box &left, const Box &right)
{
return (left.i < right.i);
}
ostream& operator<<(ostream &os, const Box &b)
{
os << b.d;
return os;
}
Этот тестовый код:
int main()
{
Box b1(3,2), b2(2,1), b3(0, 9);
map<Box, int> bmap;
bmap.insert(pair<Box,int>(b1, 10));
bmap.insert(pair<Box,int>(b2, 10));
bmap.insert(pair<Box,int>(b3, 10));
for (map<Box,int>::iterator iter = bmap.begin(); iter != bmap.end(); ++iter)
{
cout << iter->first << " ";
}
cout << endl;
return 0;
}
Если я удалю определение оператора < в классе Box компилятор будет жаловаться (ошибка), если я попытаюсь вставить объект Box в std:: map.
У меня есть некоторый опыт работы с Java, и я знаю, что в подобных случаях я просто должен позволить Box реализовать Comarable. И компилятор Java проверяет этот контракт во время компиляции, потому что Map в Java требует, чтобы его тип ключа соответствовал Comparable.
И если я хочу определить свой собственный тип карты в Java, мне просто нужно написать:
public class MyMap<K extends Comparable<K>, V>
Итак, мой вопрос: если я хочу реализовать свой собственный тип карты (например, MyMap) на С++, как определить MyMap, чтобы компилятор знал во время компиляции, что "MyMap требует, чтобы его key_type имел свое собственное перегруженное определение оператора <?"