В GCC я получаю
so.cpp:8:27: error: expected '>'
if(this->b.foo < 1)
^
Таким образом, компилятор считает, что в fooэтой строке относится к классу fooвыше и ожидает аргумент шаблона. Это похоже на то, что вы видите.
Когда вы меняете его на <=, который лексер маркирует как один токен. Следующий этап даже не видит <, поэтому его это не смущает.
Если вы измените класс на имя, отличное от long bar, то у него не будет этой проблемы. Кроме того, у @ Jarod42 есть предложения в его комментарии к вашему вопросу (больше квалификации или параны).
Компиляторы написаны поэтапно, где каждый этап переводит код в лучшее представление для следующего, и каждый этап может делать все более и более сложные вещи с этим представлением.
В начале, компилятор "лексирует" код, который превращает отдельные символы в файле в поток токенов - он будет видеть эту строку как что-то вроде
// if(this->b.foo < 1)
- keyword(if)
- left-paren
- keyword(this)
- operator(->)
- name(b)
- operator(.)
И тогда дело доходит до foo. Вероятно, следует сделать
- name(foo)
- operator(<)
- number(1)
- right-paren
Но мне кажется, что когда он видит foo, он смотрит в будущее, видит <и тот факт, который foo<class T>существует, и он пытается сделать из него один токен, foo< ...но затем он не может найти тот, >чтобы завершить его.
Это всего лишь предположение - это может быть этап мимо лексера, который пытается найти имена и может комбинировать токены. В любом случае, многократное использование foo обманывает его.
b.bar::fooили скобки ((this->b.foo) < 1)