Поскольку bar
в a.bar
является зависимым именем , компилятор не знает, что это шаблон.Вы должны указать это, иначе компилятор интерпретирует последующие <…>
как бинарные операторы сравнения:
a.template bar<8>(9);
Компилятор ведет себя правильно.
Причина такого поведения заключается в специализации.Представьте, что вы специализировали класс Foo
для некоторого значения:
template <>
struct Foo<0> {
int bar;
};
Теперь ваш исходный код будет компилироваться, но это будет означать что-то совершенно другое.На первом этапе синтаксического анализа компилятор еще не знает, какую специализацию Foo
вы используете здесь, поэтому он должен устранить неоднозначность между двумя возможными вариантами использования a.bar
;отсюда ключевое слово template
, показывающее компилятору, что последующие <…>
являются аргументами шаблона.