मैं कैसे उपयोग करने के लिए समझने के लिए काम करने के लिए एक सरल उदाहरण प्राप्त करने की कोशिश कर रहा हूं std::enable_if
। इस उत्तर को पढ़ने के बाद , मैंने सोचा कि एक साधारण उदाहरण के साथ आना बहुत कठिन नहीं होना चाहिए। मैं std::enable_if
दो सदस्य-कार्यों के बीच चयन करना चाहता हूं और उनमें से केवल एक का उपयोग करने की अनुमति देता हूं।
दुर्भाग्य से, निम्नलिखित जीसीसी 4.7 के साथ संकलन नहीं करता है और घंटों और घंटों की कोशिश के बाद मैं आप लोगों से पूछ रहा हूं कि मेरी गलती क्या है।
#include <utility>
#include <iostream>
template< class T >
class Y {
public:
template < typename = typename std::enable_if< true >::type >
T foo() {
return 10;
}
template < typename = typename std::enable_if< false >::type >
T foo() {
return 10;
}
};
int main() {
Y< double > y;
std::cout << y.foo() << std::endl;
}
gcc निम्नलिखित समस्याओं की रिपोर्ट करता है:
% LANG=C make CXXFLAGS="-std=c++0x" enable_if
g++ -std=c++0x enable_if.cpp -o enable_if
enable_if.cpp:12:65: error: `type' in `struct std::enable_if<false>' does not name a type
enable_if.cpp:13:15: error: `template<class T> template<class> T Y::foo()' cannot be overloaded
enable_if.cpp:9:15: error: with `template<class T> template<class> T Y::foo()'
G ++ दूसरे सदस्य फ़ंक्शन के लिए गलत इंस्टेंशन को क्यों नहीं हटाता है? मानक के अनुसार, std::enable_if< bool, T = void >::type
केवल तब मौजूद होता है जब बूलियन टेम्पलेट पैरामीटर सही होता है। लेकिन g ++ इसे SFINAE क्यों नहीं मानता? मुझे लगता है कि ओवरलोडिंग त्रुटि संदेश इस समस्या से आता है कि g ++ दूसरे सदस्य फ़ंक्शन को नहीं हटाता है और मानता है कि यह एक अधिभार होना चाहिए।
std::is_same< T, int >::value
और ! std::is_same< T, int >::value
जो समान परिणाम देता है।