En GCC, me sale
so.cpp:8:27: error: expected '>'
if(this->b.foo < 1)
^
Entonces, el compilador piensa que foo
en esa línea se refiere a la clase foo
anterior y espera un argumento de plantilla. Esto es similar a lo que estás viendo.
Cuando lo cambia a <=
, que el lexer tokeniza como un token único. La siguiente etapa ni siquiera ve a <
, por lo que no se confunde con ella.
Si cambia la clase para que no tenga el mismo nombre que la entrada larga bar
, entonces no tiene este problema. Además, @ Jarod42 tiene sugerencias en su comentario a su pregunta (más calificación o parens).
Los compiladores se escriben en etapas, donde cada etapa traduce el código a una mejor representación para la siguiente, y cada etapa puede hacer cosas cada vez más complejas con esa representación.
Al principio, el compilador "lexes" el código, que convierte los caracteres individuales en el archivo en una secuencia de tokens; vería esta línea como algo así como
// if(this->b.foo < 1)
- keyword(if)
- left-paren
- keyword(this)
- operator(->)
- name(b)
- operator(.)
Y luego llega a la foo
. Probablemente debería hacer
- name(foo)
- operator(<)
- number(1)
- right-paren
Pero, me parece que cuando ve foo
, mira hacia adelante, ve el <
hecho y el hecho de que foo<class T>
existe e intenta hacer una sola ficha foo< ...
pero luego no puede encontrar la >
para completarla.
Esto es solo una suposición: podría ser una etapa más allá del lexer que intenta encontrar nombres y puede combinar tokens. En cualquier caso, los múltiples usos de foo lo están engañando.
b.bar::foo
o paréntesis ((this->b.foo) < 1
)