GCC'de,
so.cpp:8:27: error: expected '>'
if(this->b.foo < 1)
^
Derleyici foo
, bu satırdaki öğenin foo
yukarıdaki sınıfa başvurduğunu ve bir şablon argümanı beklediğini düşünüyor. Bu gördüğünüze benzer.
Bunu değiştirdiğinizde <=
, lexer tarafından tek bir belirteç olarak belirtilir. Bir sonraki aşama a'yı bile görmez <
, bu yüzden onun tarafından karıştırılmaz.
Sınıfı, uzun süre ile aynı ada bar
sahip olmayacak şekilde değiştirirseniz, bu sorunla karşılaşılmaz. Ayrıca, @ Jarod42, sorunuzun yorumunda önerilere sahiptir (daha fazla nitelik veya ebeveyn).
Derleyiciler, her aşamanın kodu bir sonraki için daha iyi bir temsile çevirdiği aşamalar halinde yazılır ve her aşama bu temsil ile daha karmaşık şeyler yapabilir.
Başlangıçta, derleyici dosyadaki karakterleri bir jeton akışına dönüştüren kodu "lexes" - bu satırı aşağıdaki gibi görür
// if(this->b.foo < 1)
- keyword(if)
- left-paren
- keyword(this)
- operator(->)
- name(b)
- operator(.)
Ve sonra foo
. Muhtemelen yapmalı
- name(foo)
- operator(<)
- number(1)
- right-paren
Ama bana göre foo
, gördüğü zaman , ileriye bakıyor, var ve <
gerçeği görüyor ve foo<class T>
tek bir jeton yapmaya çalışıyor foo< ...
ama sonra bunu >
tamamlamak için bulamıyor .
Bu sadece bir tahmindir - isimleri bulmaya çalışan ve simgeleri birleştirebilen lexer'ın ötesinde bir sahne olabilir. Her durumda, foo'nun çoklu kullanımları onu kandırıyor.
b.bar::foo
veya parantez ((this->b.foo) < 1
)