क्‍लास बग - क्‍लास बग - क्‍लास अपनी निजी स्‍टैटिक कॉन्‍स्‍टेक्‍ट पद्धति का उपयोग नहीं कर सकता है?


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 का मुख्य मुद्दा है । मानक स्पष्ट नहीं है कि उपनाम जाँच के लिए अभिगम कैसे किया जाता है (परिभाषा के संदर्भ में, या उपयोग के संदर्भ में)।

वर्तमान दिशा परिभाषा के संदर्भ में जाँच करने के लिए है, जो आपके कोड को अच्छी तरह से बनाएगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.