выдержка из C ++ шаблонов
Конструкция .template
Очень похожая проблема была обнаружена после введения typename. Рассмотрим следующий пример с использованием стандартного типа набора битов:
template<int N>
void printBitset (std::bitset<N> const& bs)
{
std::cout << bs.template to_string<char,char_traits<char>,
allocator<char> >();
}
Странная конструкция в этом примере - .template. Без такого дополнительного использования шаблона компилятор не знает, что следующий за ним токен «<» не является «меньше чем», но является началом списка аргументов шаблона. Обратите внимание, что это проблема, только если конструкция перед периодом зависит от параметра шаблона. В нашем примере параметр bs зависит от параметра шаблона N. </p>
В заключение, обозначение .template (и аналогичные обозначения, такие как -> template) следует использовать только внутри шаблонов и только в том случае, если они соответствуют чему-то, что зависит от параметра шаблона.