В G CC я получаю
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 обманывает его.