Nel GCC, ottengo
so.cpp:8:27: error: expected '>'
if(this->b.foo < 1)
^
Quindi, il compilatore pensa che foosu quella riga si riferisca alla classe foosopra e si aspetta un argomento template. Questo è simile a quello che stai vedendo.
Quando lo cambi in <=, che viene tokenizzato dal lexer come un singolo token. La fase successiva non vede nemmeno un <, quindi non è confusa da esso.
Se cambi la classe in modo che non abbia lo stesso nome del long in bar, allora non ha questo problema. Inoltre, @ Jarod42 ha suggerimenti nel suo commento alla tua domanda (più qualifiche o parentesi).
I compilatori sono scritti in più fasi, in cui ogni fase traduce il codice in una rappresentazione migliore per la successiva e ogni fase può fare cose sempre più complesse con quella rappresentazione.
All'inizio, il compilatore "allenta" il codice, che trasforma i singoli caratteri nel file in un flusso di token: vedrebbe questa riga come qualcosa di simile
// if(this->b.foo < 1)
- keyword(if)
- left-paren
- keyword(this)
- operator(->)
- name(b)
- operator(.)
E poi arriva al foo. Probabilmente dovrebbe fare
- name(foo)
- operator(<)
- number(1)
- right-paren
Ma a me sembra che quando vede foo, guarda avanti, vede il <e il fatto che foo<class T>esiste e cerca di ricavarne un singolo token foo< ...ma non riesce a trovarlo >per completarlo.
Questa è solo una supposizione: potrebbe essere una fase oltre il lexer che cerca di trovare nomi e può combinare token. In ogni caso, i molteplici usi di foo lo stanno ingannando.
b.bar::fooo parentesi ((this->b.foo) < 1)