निम्नलिखित कोड है, जो वर्ग टेम्पलेट 'विशेष', सदस्य समारोह सूचक प्रकार की वापसी प्रकार के आधार पर विशेषज्ञ के लिए प्रयास करता, VC9 साथ एक संकलन त्रुटि में परिणाम:वर्ग टेम्पलेट आंशिक विशेषज्ञता सदस्य समारोह वापसी प्रकार पर parametrized
template<class F> struct special {};
template<class C> struct special<void(C::*)()> {};
template<class R, class C> struct special<R(C::*)()> {};
struct s {};
int main()
{
special<void(s::*)()> instance;
return 0;
}
त्रुटि C2752: 'विशेष': http://ideone.com/ekWGg
: एक से अधिक आंशिक विशेषज्ञता टेम्पलेट तर्क सूची
एक ही कोड के रूप में द्वारा दिखाए गए, जीसीसी-4.3.4 द्वारा स्वीकार किया जाता से मेल खाता हैक्या यह वीसी 9 में एक बग है और यदि ऐसा है, तो क्या यह बग वीसी 10 में बनी हुई है?
मैं लेकिन एक horrendously घुसपैठ वैकल्पिक हल (। इस विशिष्ट उपयोग के मामले में कम से कम और अधिक सामान्य समाधान का स्वागत के लिए) के साथ आए हैं:
#include <boost/function_types/result_type.hpp>
#include <boost/type_traits/is_same.hpp>
template<typename F, typename R>
struct is_result_same :
boost::is_same<
typename boost::function_types::result_type<F>::type,
R
>
{};
template<class F, bool = is_result_same<F, void>::value>
struct special {};
template<class R, class C> struct special<R(C::*)(), true> {};
template<class R, class C> struct special<R(C::*)(), false> {};
मैं कल्पना यह है वर्ग टेम्पलेट विशेषज्ञता की तुलना में अधिक विशिष्ट है क्योंकि आर 'शून्य' होने के मामले को हल करते समय दोनों विशेषज्ञताओं के हस्ताक्षर वास्तव में वही हैं ... 'टाइपनाम' कीवर्ड का कुछ चालाक उपयोग मदद कर सकता है लेकिन मैं इस समय कुछ भी चालाक नहीं सोच सकता। – AJG85