#include <map>
#include <string>
#include <stdio.h>
class FOO
{
public:
FOO() { printf("FOO::FOO()\n"); }
FOO(const FOO&) { printf("FOO::FOO(const FOO &)\n"); }
FOO& operator=(const FOO &) { printf("FOO::oprartor=(const FOO&)\n"); return *this; }
~FOO() { printf("FOO::~FOO\n"); }
bool operator<(const FOO&) const { return "FOO::operator<(const FOO&)\n"; }
bool operator>(const FOO&) const { return "FOO::operator>(const FOO&)\n"; }
bool operator<=(const FOO&) const { return "FOO::operator<=(const FOO&)\n"; }
bool operator>=(const FOO&) const { return "FOO::operator>=(const FOO&)\n"; }
bool operator==(const FOO&) const { return "FOO::operator==(const FOO&)\n"; }
bool operator!=(const FOO&) const { return "FOO::operator!=<(const FOO&)\n"; }
};
class BAR
{
public:
BAR() { printf("BAR::BAR()\n"); }
BAR(const BAR&) { printf("BAR::BAR(const BAR &)\n"); }
BAR& operator=(const BAR &) { printf("BAR::oprartor=(const BAR&)\n"); return *this; }
~BAR() { printf("BAR::~BAR\n"); }
bool operator<(const BAR&) const { return "BAR::operator<(const BAR&)\n"; }
bool operator>(const BAR&) const { return "BAR::operator>(const BAR&)\n"; }
bool operator<=(const BAR&) const { return "BAR::operator<=(const BAR&)\n"; }
bool operator>=(const BAR&) const { return "BAR::operator>=(const BAR&)\n"; }
bool operator==(const BAR&) const { return "BAR::operator==(const BAR&)\n"; }
bool operator!=(const BAR&) const { return "BAR::operator!=<(const BAR&)\n"; }
};
int main(void)
{
typedef std::pair<FOO, BAR> FooBar;
typedef std::pair<const FOO&, const BAR&> FooBarRef;
std::map<FooBar, int> myMap;
FOO foo;
BAR bar;
printf("\nMethod 1:\n");
myMap.insert(std::make_pair(FooBar(foo, bar), 1));
printf("Done\n\n");
myMap.clear();
printf("\nMethod 2:\n");
myMap.insert(std::make_pair(FooBarRef(foo, bar), 1));
printf("Done\n\n");
}