Это используется для того, что бы можно было получить параметр шаблона извне. Обычно для того, что бы иметь абстрактное имя для типа хранимых элементов, типов итераторов, да и любых типов, производных от параметров шаблона.
Именно этот пример неудачный, т.к.
value_type
вы берёте опять же из явно указанного шаблона. Если вы поменяете тип
P
например на
Point<double>
, то и тип
X
придётся изменить.
Вот пример получше:
typedef Point<int> MyPoint;
MyPoint P = {1, 2};
MyPoint::value_type X = P.x;
Теперь тип достаточно изменить в одном месте, а не в каждом куске кода, где он используется.