Nasıl kullanılacağını anlamak için çalışmak için basit bir örnek almaya çalışıyorum std::enable_if. Bu cevabı okuduktan sonra basit bir örnek bulmanın çok zor olmaması gerektiğini düşündüm. Kullanmak istediğim std::enable_ifiki üye fonksiyonları arasında seçim ve bunlardan yalnızca birini kullanılacak izin vermek.
Ne yazık ki, aşağıdaki gcc 4.7 ile derlenmez ve saatlerce ve denedikten sonra size hatamın ne olduğunu soruyorum.
#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 aşağıdaki sorunları bildirir:
% 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()'
Neden g ++ ikinci üye işlevi için yanlış örneği silmiyor? Standarda göre, std::enable_if< bool, T = void >::typeyalnızca boolean şablon parametresi doğru olduğunda bulunur. Ama neden g ++ bunu SFINAE olarak görmüyor? Aşırı yükleme hata iletisi, g ++ ikinci üye işlevini silmez ve bunun bir aşırı yük olması gerektiğine inanıyor sorundan geldiğini düşünüyorum.
std::is_same< T, int >::valueve ! std::is_same< T, int >::valuebu da aynı sonucu veriyor.