2015-06-20 14 views
8
#include <type_traits> 

struct A{}; 
struct B{}; 

template <typename T> 
struct Foo 
{ 
    typename std::enable_if<std::is_same<T, A>::value>::type 
    bar() 
    {} 

    typename std::enable_if<std::is_same<T, B>::value>::type 
    bar() 
    {} 
}; 

त्रुटि संदेश: cpp.sh परएसएफआईएनएई (enable_if) क्लास टेम्पलेट के सदस्य कार्यों के लिए क्यों काम नहीं करता है?

14:5: error: 'typename std::enable_if<std::is_same<T, B>::value>::type Foo<T>::bar()' cannot be overloaded 10:5: 
error: with 'typename std::enable_if<std::is_same<T, A>::value>::type Foo<T>::bar()' 

स्रोत। मैंने सोचा कि typename std::enable_if<std::is_same<T,?>::value>::type दोनों एक ही समय में वैध नहीं हो सका।

संपादित

भावी पीढ़ी के लिए यहां मेरे संपादन @ KerrekSB के जवाब पर आधारित है - SFINAE केवल deduced टेम्पलेट तर्क

#include <type_traits> 

struct A{}; 
struct B{}; 

template<typename T> 
struct Foo 
{ 
    template<typename U = T> 
    typename std::enable_if<std::is_same<U,A>::value>::type 
    bar() 
    { 
    } 

    template<typename U = T> 
    typename std::enable_if<std::is_same<U,B>::value>::type 
    bar() 
    { 
    } 
}; 

int main() 
{ 
}; 

उत्तर

12

SFINAE केवल के लिए निष्कर्ष निकाला टेम्पलेट तर्क काम करता है के लिए काम करता है, यानी फ़ंक्शन टेम्पलेट्स के लिए। आपके मामले में, दोनों टेम्पलेट्स बिना शर्त रूप से तत्काल हैं, और तत्काल विफल रहता है।

निम्नलिखित संस्करण काम करता है:

struct Foo 
{ 
    template <typename T> 
    typename std::enable_if<std::is_same<T, A>::value>::type bar(T) {} 

    // ... (further similar overloads) ... 
}; 

अब Foo()(x) कारणों भार के का सबसे कम एक instantiated किया जाना है, के बाद से तर्क प्रतिस्थापन अन्य सभी लोगों में विफल रहता है।

आप अपने मूल संरचना के साथ रहना चाहते हैं, स्पष्ट वर्ग टेम्पलेट विशेषज्ञता का उपयोग करें:

template <typename> struct Foo; 

template <> struct Foo<A> { void bar() {} }; 
template <> struct Foo<B> { void bar() {} }; 
+1

* SFINAE केवल deduced टेम्पलेट तर्क के लिए काम करता है * ... यही कारण है कि कुंजी है !!!!! धन्यवाद गुच्छा @ केरेक। बीटीडब्ल्यू, मेरी मूल पोस्ट MWE है। – Olumide

+2

@ ओलुमाइड: हां, केवल प्रतिस्थापन विफलता जो कटौती के परिणामस्वरूप त्रुटियां नहीं हैं। स्पष्ट रूप से अनुरोध किए गए प्रतिस्थापन हार्ड त्रुटि के रूप में विफल हो जाते हैं। (इस मामले के लिए एक एमएफई पर्याप्त है!) –

+0

क्या इस तरह एक ओवरलोडेड कन्स्ट्रक्टर है? – Brent

संबंधित मुद्दे