जीसीसी में, मुझे मिलता है
so.cpp:8:27: error: expected '>'
if(this->b.foo < 1)
^
इसलिए, संकलक को लगता है कि foo
उस लाइन पर foo
ऊपर वर्ग को संदर्भित करता है और एक टेम्पलेट तर्क की उम्मीद कर रहा है। यह वैसा ही है जैसा आप देख रहे हैं।
जब आप इसे बदल देते हैं <=
, जो कि एक टोकन के रूप में लेसर द्वारा टोकन दिया जाता है। अगले चरण में ए भी नहीं दिखता है <
, इसलिए यह इसे भ्रमित नहीं करता है।
यदि आप कक्षा को लंबे समय तक उसी नाम से नहीं बदलने के लिए बदलते हैं bar
, तो यह समस्या नहीं है। इसके अलावा, @ Jarod42 ने आपके प्रश्न के लिए अपनी टिप्पणी में सुझाव दिए हैं (अधिक योग्यता या पारेंस)।
कंपाइलरों को चरणों में लिखा जाता है, जहां प्रत्येक चरण अगले के लिए बेहतर प्रतिनिधित्व के लिए कोड का अनुवाद करता है, और प्रत्येक चरण उस प्रतिनिधित्व के साथ अधिक से अधिक जटिल चीजें कर सकता है।
प्रारंभ में, संकलक "लेक्स" कोड, जो फ़ाइल में व्यक्तिगत पात्रों को टोकन की एक धारा में बदल देता है - यह इस रेखा को कुछ इस तरह से देखेगा
// 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< ...
लेकिन फिर इसे >
पूरा करने के लिए नहीं मिल सकता है।
यह सिर्फ एक अनुमान है - यह लेक्सर के अतीत का एक मंच हो सकता है जो नामों को खोजने की कोशिश करता है और टोकन को जोड़ सकता है। किसी भी मामले में, फू के कई उपयोग इसे धोखा दे रहे हैं।
b.bar::foo
या कोष्ठक ((this->b.foo) < 1
)