ใน GCC ฉันจะได้รับ
so.cpp:8:27: error: expected '>'
    if(this->b.foo < 1) 
                      ^
ดังนั้นคอมไพเลอร์คิดว่าfooในบรรทัดนั้นหมายถึงคลาสfooข้างบนและคาดว่าจะมีอาร์กิวเมนต์เท็มเพลต สิ่งนี้คล้ายกับสิ่งที่คุณเห็น
เมื่อคุณเปลี่ยนเป็น<=ซึ่งโทเค็นโดย lexer เป็นโทเค็นเดียว ขั้นตอนต่อไปไม่เห็นแม้แต่ a <ดังนั้นจึงไม่สับสน
หากคุณเปลี่ยนชั้นเรียนให้ไม่มีชื่อเหมือนกันกับระยะเวลานานแสดงbarว่าไม่มีปัญหานี้ นอกจากนี้ @ Jarod42 มีข้อเสนอแนะในความคิดเห็นของเขาสำหรับคำถามของคุณ (คุณสมบัติเพิ่มเติมหรือ parens)
คอมไพเลอร์ถูกเขียนเป็นขั้นตอนโดยที่แต่ละขั้นตอนแปลรหัสเป็นตัวแทนที่ดีขึ้นสำหรับขั้นตอนต่อไปและแต่ละขั้นตอนสามารถทำสิ่งที่ซับซ้อนมากขึ้นด้วยการเป็นตัวแทนนั้น
ในตอนเริ่มต้นคอมไพเลอร์ "lexes" โค้ดซึ่งเปลี่ยนอักขระแต่ละตัวในไฟล์ให้เป็นกระแสโทเค็น - มันจะเห็นบรรทัดนี้เป็นสิ่งที่ชอบ
// if(this->b.foo < 1) 
- keyword(if)
- left-paren
- keyword(this)
- operator(->)
- name(b)
- operator(.)
fooและจากนั้นก็จะได้รับไป มันน่าจะทำ
- name(foo)
- operator(<)
- number(1)
- right-paren
แต่ดูเหมือนว่าฉันจะเห็นเมื่อมันมองfooไปข้างหน้าเห็น<และความจริงที่foo<class T>มีอยู่และมันพยายามที่จะทำโทเค็นเดียวจากfoo< ...แต่ก็ไม่สามารถหา>ให้เสร็จสมบูรณ์ได้
นี่เป็นเพียงการคาดเดา - อาจเป็นขั้นตอนที่ผ่านมากับ lexer ที่พยายามค้นหาชื่อและสามารถรวมโทเค็นได้ ไม่ว่าในกรณีใดการใช้งานหลายอย่างของ foo จะหลอกมัน
               
              
b.bar::fooหรือวงเล็บ ((this->b.foo) < 1)