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_if
iki ü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 >::type
yalnı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 >::value
ve ! std::is_same< T, int >::value
bu da aynı sonucu veriyor.