Проблема в том, что поскольку компилятор C ++ не знает фактический тип T
(не говоря уже о T::NodeVector
, он не знает, что magnitude
должен быть шаблоном. Вам необходимо указать это явно :
x.template magnitude<double>();
В противном случае C ++ будет анализировать токены как x
, operator.
, magnitude
, operator<
, double
, operator>
…
Кстати, GCC прав. MSVC ++ небезызвестен в таких вопросах.