শ্রেণি তার নিজস্ব ব্যক্তিগত স্ট্যাটিক কনস্টেক্সারপ পদ্ধতিতে অ্যাক্সেস করতে পারে না - কলং বাগ?


28

এই কোডটি কলং (6,7,8,9, ট্রাঙ্ক) তে সংকলন করে না, তবে জিসিসিতে (7.1, 8.1, 9.1) জরিমানা সংকলন করেছে:

template<class T> struct TypeHolder { using type = T; };

template<int i>
class Outer {
private:
    template<class T> 
    static constexpr auto compute_type() {
        if constexpr (i == 42) {
            return TypeHolder<bool>{};
        } else {
            return TypeHolder<T>{};
        }
    }

public:
    template<class T>
    using TheType = typename decltype(Outer<i>::compute_type<T>())::type;
};

int main() {
    Outer<42>::TheType<int> i;
}

ঝনঝন আমাকে বলে:

<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'

… এটি অবশ্যই কোনটি তবে আমি একই শ্রেণীর ভিতরে থেকে সেই সদস্যকে অ্যাক্সেস করার চেষ্টা করছি । কেন এটি সেখানে অ্যাক্সেসযোগ্য হবে না আমি তা দেখতে পাচ্ছি না। আমি কি একটি ঝাঁকুনি বাগ আঘাত (এবং আমি ফাইল করা উচিত)?

আপনি কোড সহ খেলনা প্রায় পারেন Godbolt এর কম্পাইলার এক্সপ্লোরার


3
স্পষ্টত যোগ করা friend int main();কলম্বকে অভিযোগ করা থেকে বিরত করে।
হলিব্ল্যাকট্যাগ

2
হাস্যকর! তবে অ্যাক্সেস চেকটি অবশ্যই "অনুমতি" দিয়ে তৈরি করা উচিত Outer<42>, তাই না main? আমার কাছে এখন বাগের মতো আরও বেশি খুঁজছেন।
লুকাশ বার্থ

ব্যবহার করে std::result_ofপরিবর্তে কাজ করে?
ব্র্যান্ডন

এফডাব্লুআইডাব্লু, আইসিসি এবং এমএসভিসিতেও কাজ করে।
ক্রিসএমএম

উত্তর:


23

এটি কোর ইস্যু 1554 । উপন্যাস টেমপ্লেটগুলির জন্য কীভাবে অ্যাক্সেস চেকিং করা হয় (মান সংজ্ঞা বা ব্যবহারের প্রসঙ্গে) মানটি অস্পষ্ট।

বর্তমান দিকনির্দেশনাটি সংজ্ঞাটির প্রসঙ্গে যাচাই করা, যা আপনার কোডটিকে সুসংহত করে তোলে।

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