টেমপ্লেট টেম্পলেট শ্রেণীর সাথে জিসিসি / সি ++ 17 এ সমস্যা


10

নিম্নলিখিত 2 টি অতিরিক্ত বোঝা বিবেচনা করুন

template<typename T>
bool test() {
    return true;
}

template<template<typename ...> class T>
bool test() {
    return false;
}

প্রথম জন নিয়মিত ক্লাসের জন্য কাজ করে, যখন দ্বিতীয়টি তাত্ক্ষণিকভাবে নয় এমন টেম্পলেটগুলির জন্য কাজ করে। এই ক্ষেত্রে:

    std::cout<<test<int>()<<std::endl; <-- this yields 1
    std::cout<<test<std::list>()<<std::endl; <--this yields 0

এখন নিম্নলিখিত টেমপ্লেট ফাংশন বিবেচনা করুন:

template<typename U>
bool templfun(){
    struct A{
        bool f(){
            return test<A>(); // <-- this gives an error
        }
    };
    return test<A>();  // <-- this is ok
}

জিসিসিতে এটি অস্পষ্ট ওভারলোড রেজোলিউশনের জন্য ত্রুটি দেয়, যখন ক্ল্যাং সংকলন করে। মজার বিষয় হল, দ্বিতীয় কলটি পরীক্ষার () ত্রুটিগুলি তৈরি করে না (এমনকি জিসিসিতেও)। তদুপরি, আমি template<typename U>টেম্পলফুনের উপরে জিনিসটি সরিয়ে ফেললে, জিসিসি অভিযোগ করা বন্ধ করে দেয়।

এটি কি জিসিসির সাথে একটি বাগ বা এটি অবৈধ কোড?

উত্তর:


4

জিসিসি ভুল; struct Aএকটি তাত্পর্যযুক্ত সত্তা তবে পরিষ্কারভাবে কোনও টেমপ্লেট নয় (যেমন এটি templateকোনও মূলশব্দ দিয়ে শুরু হয় না ), সুতরাং কোনও দ্বিধাগ্রস্ততা নেই।

নিশ্চিত করতে, আমরা G ++ টেমপ্লেট-টেম্পলেট ওভারলোড ব্যবহার করার চেষ্টা করছে তা দেখতে পরামিতি টাইপের নামকরণ করতে পারি।

template <typename X>
bool test() {
    return true;
}

template <template <typename...> class Y>
bool test() {
    return false;
}

template <typename U>
bool templfun() {
    struct A {
        bool f() {
            return test<A>(); // <-- this gives an error
        }
    };
    return test<A>(); // <-- this is ok
}

bool run() {
    return templfun<int>();
}

জি ++ আউটপুট: ( গডবোল্টের লিঙ্ক )

<source>:15:27: error: call of overloaded 'test<templfun() [with U = int]::A>()' is ambiguous
   15 |             return test<A>(); // <-- this gives an error
      |                    ~~~~~~~^~

<source>:2:6: note: candidate: 'bool test() [with X = templfun() [with U = int]::A]'
    2 | bool test() {
      |      ^~~~

<source>:7:6: note: candidate: 'bool test() [with Y = templfun()::A]'
    7 | bool test() {
      |      ^~~~

স্পষ্টত " candidate: 'bool test() [with Y = templfun()::A]'" হ'ল বোগাস।

নোট করুন যে স্থানীয় ধরণেরগুলি C ++ 11 এর পূর্বে টেমপ্লেট আর্গুমেন্ট হিসাবে অনুমোদিত ছিল না (দেখুন সি ++ 03 § 14.3.1.2), যাতে জি ++ বাস্তবায়নের জটিলতা ব্যাখ্যা করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.