#include <set>
#include <iostream>
using namespace std;

template<class T> 
class A 
{   
    public:
        A(T a = T(), T b = T()): m_a(a), m_b(b) {}

        bool operator<(const A& rhs) const
        {
            return ((m_a < rhs.m_a) ||
                    ((m_a == rhs.m_a) && (m_b < rhs.m_b))
                   );
            /* alterrnatively:
            return std::tie(m_a, m_b) < std::tie(rhs.m_a, rhs.m_b);
            */
        }
              
        friend ostream& operator<<(ostream &out, const A& value)
        {
            return out << value.m_a << ' ' << value.m_b;
        }

    private:
        T m_a;
        T m_b;   
};  

int main()   
{
    A<int> abc(2,3);
    A<int> def(1,5);

    set<A<int>> P2D;
    P2D.insert(abc);
    P2D.insert(def);

	for(const auto &elem : P2D) {
		cout << elem << endl;
	}
    
    return 0;   
}