में डीक्लटाइप और मित्र फ़ंक्शन वेक्टर गणित करने के लिए कुछ सी ++ कोड लिख रहे थे। 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
क्यों यहाँ 'typename' आवश्यक है? –
@duiu: क्योंकि 'std :: array' एक निर्भर प्रकार है। –
ildjarn