मैं SFINAE का उपयोग उस वर्ग को अलग करने के लिए कर रहा हूं जिसमें 'नाम' नामक सदस्य है। मैंने चीजों को मानक पैटर्न के रूप में स्थापित किया है लेकिन यह काम नहीं कर रहा है - चुपचाप 'विफल' प्रतिस्थापन को अनदेखा करने के बजाय, संकलक एक त्रुटि उत्पन्न करता है।SFINAE: कुछ विफलताओं दूसरों की तुलना में अधिक बराबर है?
मुझे यकीन है कि मैंने कुछ टेम्पलेट प्रतिस्थापन नियम के खिलाफ भाग लिया है, अगर कोई व्यक्ति समझा सकता है तो मैं आभारी रहूंगा।
यह एक अलग उदाहरण है। मैं जीसीसी उपयोग कर रहा हूँ:
template <typename U> string test(char(*)[sizeof(U::name)] = 0) { return "has name!"; }
template <typename U> string test(...) { return "no name"; }
struct HasName { string name; }
struct NoName {}
cout << "HasName: " << test<HasName>(0) << endl; //fine
cout << "NoName: " << test<NoName>(0) << endl; //compiler errors:
//error: size of array has non-integral type `<type error>'
//error: `name' is not a member of `NoName'
आप किस कंपाइलर का उपयोग कर रहे हैं? g ++ 4.4.3 इस कोड को स्वीकार करता है और '-Wall -Wextra -pedantic' के साथ भी कोई निदान नहीं करता है। –
@ टाइलर: क्या यह 'संरचना' परिभाषाओं के बाद लापता अर्ध-कॉलन के लिए निदान भी नहीं करता है? ;-) –
ओह :-); मुझे यकीन है कि यह करता है (लापरवाही टाइपिंग को क्षमा करें) –