Dans GCC, je reçois
so.cpp:8:27: error: expected '>'
if(this->b.foo < 1)
^
Ainsi, le compilateur pense que le foo
sur cette ligne se réfère à la classe foo
ci-dessus et attend un argument de modèle. C'est similaire à ce que vous voyez.
Lorsque vous le changez en <=
, qui est symbolisé par le lexer comme un seul jeton. La prochaine étape ne voit même pas de <
, donc elle n'est pas confondue.
Si vous changez la classe pour ne pas avoir le même nom que le long in bar
, alors il n'a pas ce problème. Aussi, @ Jarod42 a des suggestions dans son commentaire à votre question (plus de qualification ou de parens).
Les compilateurs sont écrits en étapes, où chaque étape traduit le code en une meilleure représentation pour la suivante, et chaque étape peut faire des choses de plus en plus complexes avec cette représentation.
Au début, le compilateur "lexe" le code, qui transforme les caractères individuels du fichier en un flux de jetons - il verrait cette ligne comme quelque chose comme
// if(this->b.foo < 1)
- keyword(if)
- left-paren
- keyword(this)
- operator(->)
- name(b)
- operator(.)
Et puis ça arrive au foo
. Cela devrait probablement faire
- name(foo)
- operator(<)
- number(1)
- right-paren
Mais, il me semble que quand il voit foo
, il regarde vers l'avant, voit le <
et le fait qui foo<class T>
existe et il essaie de faire un seul jeton, foo< ...
mais il ne peut pas trouver le >
pour le compléter.
C'est juste une supposition - cela pourrait être une étape après le lexeur qui essaie de trouver des noms et peut combiner des jetons. Dans tous les cas, les multiples utilisations de foo le trompent.
b.bar::foo
(this->b.foo) < 1