জিসিসিতে, আমি পেয়েছি
so.cpp:8:27: error: expected '>'
if(this->b.foo < 1)
^
সুতরাং, সংকলকটি মনে করে যে সেই foo
লাইনে থাকাটি foo
উপরের শ্রেণিকে বোঝায় এবং একটি টেম্পলেট যুক্তির প্রত্যাশা করে। এটি আপনি যা দেখছেন তার অনুরূপ।
আপনি যখন এটিকে পরিবর্তন করেন <=
, যা একক টোকেন হিসাবে লেক্সারের দ্বারা টোকেনাইজড। পরবর্তী স্তরটি একটিও দেখতে পায় না <
, তাই এটি এতে বিভ্রান্ত হয় না।
আপনি যদি ক্লাস পরিবর্তন করেন তবে দীর্ঘ নামটির মতো একই নামটি না থাকে bar
, তবে এতে সমস্যা নেই। এছাড়াও, @ জারোড 42 এর আপনার প্রশ্নের মন্তব্যে (আরও যোগ্যতা বা পেরেনস) পরামর্শ রয়েছে।
সংকলকগুলি পর্যায়গুলিতে লিখিত হয়, যেখানে প্রতিটি পর্যায়টি কোডটির পরবর্তী অংশের জন্য আরও ভাল উপস্থাপনায় অনুবাদ করে এবং প্রতিটি পর্যায় সেই প্রতিনিধিত্ব দিয়ে আরও বেশি জটিল জিনিস করতে পারে।
শুরুতে, সংকলক কোডটি "লেক্স করে", যা ফাইলের স্বতন্ত্র অক্ষরগুলিকে টোকেনের প্রবাহে পরিণত করে - এটি এই লাইনটিকে এমন কিছু হিসাবে দেখবে
// 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
)