У GCC я потрапляю
so.cpp:8:27: error: expected '>'
if(this->b.foo < 1)
^
Отже, компілятор вважає, що в foo
цьому рядку посилається на клас foo
вище, і очікує аргумент шаблону. Це схоже на те, що ви бачите.
Коли ви перейдете до цього <=
, який лексемою є лексема як один маркер. Наступний етап навіть не бачить a <
, тому його не плутає.
Якщо ви змінили клас, щоб він не мав того самого імені, як довгий 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
)