Nel GCC, ottengo
so.cpp:8:27: error: expected '>'
if(this->b.foo < 1)
^
Quindi, il compilatore pensa che foo
su quella riga si riferisca alla classe foo
sopra 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::foo
o parentesi ((this->b.foo) < 1
)