यदि मैं पॉइंटर-टू-बेस-सदस्य बना देता हूं, तो मैं इसे आमतौर पर पॉइंटर-टू-व्युत्पन्न-सदस्य में परिवर्तित कर सकता हूं, लेकिन जब नीचे दिए गए बज़ जैसे टेम्पलेट में उपयोग नहीं किया जाता है, जहां पहला टेम्पलेट तर्क दूसरे को प्रभावित करता है। क्या मैं कंपाइलर कीड़े से लड़ रहा हूं या क्या मानक वास्तव में यह काम नहीं करता है?टेम्पलेट तर्कों में सदस्यों को पॉइंटर को डाउनकास्ट क्यों नहीं कर सकता?
struct Foo
{
int x;
};
struct Bar : public Foo
{
};
template<class T, int T::* z>
struct Buzz
{
};
static int Bar::* const workaround = &Foo::x;
int main()
{
// This works. Downcasting of pointer to members in general is fine.
int Bar::* y = &Foo::x;
// But this doesn't, at least in G++ 4.2 or Sun C++ 5.9. Why not?
// Error: could not convert template argument '&Foo::x' to 'int Bar::*'
Buzz<Bar, &Foo::x> test;
// Sun C++ 5.9 accepts this but G++ doesn't because '&' can't appear in
// a constant expression
Buzz<Bar, static_cast<int Bar::*>(&Foo::x)> test;
// Sun C++ 5.9 accepts this as well, but G++ complains "workaround cannot
// appear in a constant expression"
Buzz<Bar, workaround> test;
return 0;
}
निश्चित रूप से सही है, लेकिन किसी भी विचार की अनुमति क्यों नहीं है? मनमाना लगता है। –
@ जोसेफ: मैंने सोचा कि यह भी किया है, यही कारण है कि मैंने सी ++ 0x भी चेक किया। (उन्होंने फ़ंक्शन टेम्पलेट्स के लिए कोई डिफ़ॉल्ट टेम्पलेट पैरामीटर की तरह कई प्रतीत होता है कि मनमाने ढंग से निर्णय नहीं हटाए गए हैं।) या तो किसी के लिए इसका कोई उपयोग नहीं मिला है और इसलिए यह वास्तव में नहीं बदला गया है/इसलिए इसे आसानी से धक्का नहीं दिया गया था (यह एक अच्छी तरह से जोड़ने के लिए आसान है- एक टूटी हुई सुविधा को कम करने की तुलना में परीक्षण की सुविधा), या कुछ मौलिक कारण है जो मैं नहीं देख सकता। – GManNickG