क्योंकि जीसीसी व्यवहार करता है टेम्प्लेट की गई अतिभारित एक के रूप में समारोह का प्रयास करें
auto p = static_cast<void(*)()>(& h<int>);
। जीसीसी के दृष्टिकोण से ऐसा लगता है कि आपके पास h(int param)
और h(float param)
होगा - जिसे संकलक को चुनना है?
मैंने देखा कि जीसीसी के पुराने संस्करणों में समस्या क्या थी, लेकिन मैं इसे अधिक verbosely समझाने की कोशिश करूंगा। जीसीसी इस प्रकार को कम नहीं कर सका, क्योंकि टेम्पलेटेड फ़ंक्शन को अधिभारित किया गया था। यह मूल रूप से था जैसे आप निम्नलिखित होंगे:
void h(int)
{
}
void h(float)
{
}
void (*p)(int) = & h; //ok
void (*p)(float) = & h; //ok
auto p = & h; //error: which version of h?
जीसीसी h<int>
बस अतिभारित T
पैरामीटर के आधार पर अंतहीन विकल्पों के साथ h
समारोह की तरह था। प्रश्न में दिए गए कोड के साथ यह ओ.के. था। निम्न कार्य करें: (यही कारण है कि मैं typedefed नहीं मिलता है "काम के आसपास" है)
void (*p)() = & h<int>;
के रूप में मैंने सोचा था कि ओपी C++ 11 auto
कीवर्ड का उपयोग करने के रूप में एक टैग ने सुझाव दिया था, मैंने h<int>
को void(*)()
पर स्थिर रूप से कास्ट किया, जो कि जीसीसी की चाल करने के लिए केवल तरह का ऑपरेशन है, क्योंकि यह टेम्पलेट किए गए कार्यों और auto
से सही तरीके से निपटने में सक्षम नहीं था।
कार्य void h<int>()
और void h<float>()
पाठ्यक्रम एक ही सूचक प्रकार के साथ विभिन्न कार्यों की तरह व्यवहार की होनी चाहिए और h
समारोह के संस्करणों को ओवरलोड नहीं।जब instantiated वे void hInt()
और void hFloat()
की तरह व्यवहार करना चाहिए और तुम यहाँ की तरह ऑटो उपयोग करने के लिए सक्षम होना चाहिए:
void hInt()
{
}
void hFloat()
{
}
auto p = hInt;
p = hFloat;
लेकिन जीसीसी के लिए किसी कारण से वे h
की अतिभारित संस्करणों की तरह थे।
कृपया डाउनवॉट्स का कारण दें।
विजुअल स्टूडियो 2010 पर ठीक से संकलित करता है। यह संभवतः जीसीसी में एक गड़बड़ है। आप क्या कोशिश कर सकते हैं 'decltype (& h) पी = और एच ;' –
Puppy
कम से कम G ++ 4.6 के साथ काम करता है। – Maister
@DeadMG: "ऑटो" के बिना टाइपिफ़ की आवश्यकता नहीं है, 'शून्य (* पी)() = और एच;' संकलित भी होगा। –
doc