निम्नलिखित कोड पर विचार करें: आप test2
लाइन uncomment और जी ++ के साथ कोड को संकलित करने का प्रयास करेंएक फ़ंक्शन पॉइंटर को टेम्पलेट फ़ंक्शन में स्पष्ट और फ़ंक्शन नाम के बिना क्यों नहीं तुलना कर सकता है?
void func(int) {}
template<typename T> void templatedFunc(T) {}
int main()
{
void (*p)(int) = func;
bool test1 = p==func;
//bool test2 = p==templatedFunc<int>; // compilation error
bool test3 = p==&templatedFunc<int>; // but this works
}
, आपको निम्न त्रुटि मिल जाएगा:
test.cpp: In function ‘int main()’:
test.cpp:8:21: error: assuming cast to type ‘void (*)(int)’ from overloaded function [-fpermissive]
bool test2 = p==templatedFunc<int>; // compilation error
^~~~~~~~~~~~~~~~~~
मैं जी में इस परिणाम को प्राप्त ++ 5.3.0 और 6.2.0। साथ ही, क्लैंग ++ 3.6.0 के साथ संकलन चेतावनी के बिना सफल होता है।
कौन सा कंपाइलर मानक के अनुसार सही है - g ++, जो त्रुटि या clang ++ देता है, जो नहीं करता है?
और यदि जी ++ सही है, तो ऑपरेटर के स्पष्ट पते की आवश्यकता के संबंध में सामान्य कार्यों बनाम टेम्पलेट किए गए कार्यों के साथ ऐसी असममितता क्यों है?
मेरा सामान्य ज्ञान मुझे बताता है कि इस स्थिति में क्लैंग सही है, क्योंकि पूरी तरह से विशिष्ट फ़ंक्शन टेम्पलेट (या बल्कि एक तात्कालिकता) को सामान्य कार्य माना जाता है और इस तरह कार्य करना चाहिए। – DeiDei
क्या यह आपको 'शून्य (* पी) (int) = templatedFunc करने की अनुमति देता है;', या इसके लिए '&' की आवश्यकता होती है? –
TripeHound
बीटीडब्ल्यू, बेवकूफ तरीका '&' का उपयोग करना है। – Jarod42