টেমপ্লেট শ্রেণিতে স্ট্রাক্ট সহ সি ++ সংকলক ইস্যু


13

নিম্নলিখিত কোডটি জিসিসি বা বিড়ম্বনার সাথে সংকলন করে না

template<class T>
class foo{};

template<class T>
class template_class_with_struct
{
    void my_method() {
        if(this->b.foo < 1);
    };

    struct bar
    {
        long foo;
    } b;
};

ত্রুটি বার্তাটি হ'ল

error: type/value mismatch at argument 1 in template parameter list for 'template<class T> class foo'    
    8 |         if(this->b.foo < 1);

ত্রুটিটি টেমপ্ল্যাট ক্লাস ফু দ্বারা সৃষ্ট। <1 এর পরিবর্তে <= লেখার সময় এটিও সংকলন করে।

কোন ইঙ্গিত প্রশংসা?

সংকলক এক্সপ্লোরার লিঙ্ক https://godbolt.org/z/v6Tygo go


7
আমি কম্পাইলার বাগগুলি বলতে চাইব তবে এমএসভিসি এটির একমাত্র গ্রহণযোগ্য: - / ডেমো । সম্ভাব্য কাজের আশেপাশে b.bar::fooবা প্রথম বন্ধনী ( (this->b.foo) < 1)
জারোড 42

উত্তর:


1

জিসিসিতে, আমি পেয়েছি

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< ...তবে এটি >সম্পূর্ণ করার সন্ধান করতে পারে না।

এটি কেবলমাত্র অনুমান - এটি লেক্সারের অতীত পর্যায় হতে পারে যা নামগুলি সন্ধান করার চেষ্টা করে এবং টোকেনগুলি একত্রিত করতে পারে। যাই হোক না কেন, ফু এর একাধিক ব্যবহারগুলি এটি ট্রিক করছে।


আমি আপনার ব্যাখ্যাটি বুঝতে পেরেছি, তবে নিশ্চিত নয় যে এর অর্থ সংকলকটি সেভাবে আচরণ করা উচিত। সম্ভবত এটি বিভিন্ন সংকলকগুলির জন্য বাগ হিসাবে ক্ষেত্র হওয়া উচিত। কখনও কখনও আপনি
লিঙ্কিত

আমি মনে করি এটি একটি ত্রুটি, তবে অনুমান কী বলে আমি জানি না। তৃতীয় পক্ষের শিরোনামগুলির কারণে নামগুলির কারণ C ++ এ একটি সাধারণ ঘটনা - আপনি সাধারণত যোগ্যতার সাথে সমাধান করতে পারেন।
লু ফ্রাঙ্কো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.