2013-03-13 6 views
6

में डीक्लटाइप और मित्र फ़ंक्शन वेक्टर गणित करने के लिए कुछ सी ++ कोड लिख रहे थे। std::array उदाहरण के आसपास यह केवल एक पतली आवरण आवश्यक है। मैं बैकिंग सरणी की शुरुआत में एक इटरेटर को वापस करने के लिए गैर-सदस्य begin() फ़ंक्शन को अधिभारित करना चाहता था। ऐसा करने के लिए, मैंने auto रिटर्न प्रकार और decltype का उपयोग कर एक पिछला रिटर्न प्रकार के साथ एक साधारण मित्र फ़ंक्शन लिखा जो कि सदस्य चर के साथ कॉल को अग्रेषित करता है।विजुअल स्टूडियो बनाम जी ++

यह संकलित नहीं होगा, और मैं समझ नहीं पाया कि क्यों। मैंने एक छोटे से उदाहरण के साथ झुकाव शुरू कर दिया और जी ++ 4.7 के तहत निम्नलिखित कोड संकलनों की खोज की, लेकिन नवीनतम विजुअल स्टूडियो 2012 प्रोफेशनल के तहत नहीं।

#include <iostream> 
#include <array> 

template <typename T, size_t size> 
class MyClass { 

private: 
    std::array<T, size> elts; 

public: 
    friend auto begin(MyClass &a) -> decltype (std::begin(a.elts)) { 
     return std::begin(a.elts); 
    } 

}; 

int main(void) { 
    MyClass<int, 8> instance; 
    auto it = begin(instance); 
    std::cout << *it << std::endl; 
    return 0; 
} 

अजीब बात इस कोड को केवल ++ जी में संकलित करता है, तो elts की प्राइवेट घोषणा begin() समारोह की घोषणा से पहले आया था।

किसी भी मामले में, कौन सा कंपाइलर सही है? विजुअल स्टूडियो या जी ++?

संपादित: संकलन त्रुटि है कि VS2012 दिया error C2228: left of '.elts' must have class/struct/union

उत्तर

7

वर्ग टेम्पलेट MyClass की परिभाषा बार जब आप अभिव्यक्ति std::begin(a.elts) का उपयोग करके पूरा नहीं हुआ है, इसलिए मुझे लगता है कि कुलपति शिकायत करने के लिए एक कारण है। आप अपूर्ण प्रकार पर operator . का उपयोग नहीं कर सकते हैं।

किसी भी मामले में, आप का उपयोग कर के आसपास काम कर सकता है:

#include <iostream> 
#include <array> 

template <typename T, size_t size> 
class MyClass 
{ 
    // ... 

    friend typename std::array<T, size>::iterator begin(MyClass &a) 
    //  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    { 
     return std::begin(a.elts); 
    } 
}; 
+0

क्यों यहाँ 'typename' आवश्यक है? –

+2

@duiu: क्योंकि 'std :: array ' एक निर्भर प्रकार है। – ildjarn

संबंधित मुद्दे