ใน 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
)