#include <iostream>
using namespace std;

template <class K> struct MyPoint { };
template <class K> struct MyLine { };
template <class K> struct MyConstruct { };
template <class K> struct MyLess { };

struct Kernel {
    typedef MyPoint<Kernel> Point_2;
    typedef MyLine<Kernel> Line_2;
    typedef MyConstruct<Kernel> Construct_line_2;
    typedef MyLess<Kernel> Less_xy_2;
};

// Generate new Kernel
template <class K> struct NewPoint { };
template <class K> struct MyLeftTurn { };
struct New_kernel : public Kernel {
    typedef NewPoint<New_kernel> Point_2;
    typedef MyLeftTurn<New_kernel> Left_turn_2;
};

int main()
{
    New_kernel::Point_2 p, q;
    New_kernel::Construct_line_2 construct_line_2;
    New_kernel::Line_2 l = construct_line_2(p, q);
    return 0;
}