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