2015-12-22 8 views
12

में एक सामान्य वापसी प्रकार का निर्धारण एक सी ++ 14 आवेदन के संदर्भ में, मैं एक योजना है जिसमें इस प्रकार (कम से कम प्रतिलिपि प्रस्तुत करने योग्य परीक्षण) फिर से शुरू किया जा सकता है का उपयोग करें जीसीसी और क्लैंग कंपाइलर्स के साथ सी ++ 14 में पूरी तरह से संकलित और चलाता है।त्रुटि सी ++ 11

अब मैं अपने एप्लिकेशन को विंडोज़ में माइग्रेट करना चाहता हूं और इसके लिए मैं मिनीजीडब्लू का उपयोग कर रहा हूं। दुर्भाग्य से, इसका नवीनतम संस्करण जीसीसी 4.9 लाता है जो सी ++ 14 संकलित नहीं करता है। यह एक गंभीर समस्या की तरह प्रतीत नहीं होता है क्योंकि मैं सी ++ 14 में सी ++ 14 संरचनाओं को फिर से लिख सकता हूं।

typename Container::Iterator get_it() const 
{ 
    auto ret = typename Container::Iterator(); 
    return ret; 
} 

दुर्भाग्य से यह कोई संकलन करता है: तो, मैं get_it() विधि इस प्रकार पुनर्लेखन।

error: no type named ‘Iterator’ in ‘struct A<int>’ 
    typename Container::Iterator get_it() const 
          ^

मैं भी करने की कोशिश की:: दोनों compilers निम्न त्रुटि उत्पादन

auto get_it() const -> decltype(typename Container::Iterator()) 
{ 
    auto ret = typename Container::Iterator(); 
    return ret; 
} 

लेकिन मैं बिल्कुल वैसा ही त्रुटि मिलती है।

चूंकि दो कंपाइलर रिटर्न के प्रकार को पहचानने में विफल रहते हैं, मुझे लगता है कि इसे निर्धारित करना असंभव है। लेकिन मुझे वास्तव में क्यों नहीं पता है।

क्या कोई मुझे बता सकता है कि संकलन क्यों नहीं करें और आखिरकार सी ++ 11 में रिफैक्टरिंग के लिए एक तरीका क्यों संकलित करता है?

उत्तर

16

आप सीआरटीपी का उपयोग कर रहे हैं; LocateFunctionsA (A<int>) की अपूर्ण विशेषज्ञता के साथ तत्काल विशेषज्ञता प्राप्त है, इसलिए उस विशेषज्ञता के सदस्यों तक पहुंचने से बदले में त्रुटिपूर्ण संदेश ("नहीं ... नाम ... में ..." के बजाय भ्रामक त्रुटि संदेश देता है)। हालांकि, अपने उदाहरण में समारोह temploid get_it केवल है (यदि कभी) A<int> के बाद instantiated वास्तव में परिभाषित किया गया है, typename-विनिर्देशक अच्छी तरह से गठित बना रही है।

एक कामकाज के लिए, एक समान प्रभाव प्राप्त करने का प्रयास करें, उदा।

template <typename T=Container> 
typename T::Iterator get_it() const 
{ 
    static_assert(std::is_same<T, Container>{}, "You ain't supposed to supply T!"); 
    auto ret = typename T::Iterator(); 
    return ret; 
} 

Demo जीसीसी 4.9 के साथ।

+7

टेम्पलॉइड? क्या यह एक शब्द है? – Quentin

+6

@ क्वांटिन हां। यह 15 साल पहले खोले गए एक निश्चित डीआर से प्रभावित टेम्पलेट्स के गैर-टेम्पलेट सदस्यों को दर्शाता है। Temploid के लिए – Columbo

+3

upvote! – Barry