Ich versuche, ein einfaches Beispiel zum Arbeiten zu bringen, um zu verstehen, wie man es benutzt std::enable_if
. Nachdem ich diese Antwort gelesen hatte , dachte ich, es sollte nicht zu schwierig sein, ein einfaches Beispiel zu finden. Ich möchte verwenden std::enable_if
, um zwischen zwei Elementfunktionen zu wählen und nur eine davon zuzulassen.
Leider lässt sich das Folgende nicht mit gcc 4.7 kompilieren und nach stundenlangen Versuchen frage ich euch, was mein Fehler ist.
#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 meldet folgende Probleme:
% 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()'
Warum löscht g ++ nicht die falsche Instanziierung für die Funktion des zweiten Mitglieds? std::enable_if< bool, T = void >::type
Existiert standardmäßig nur, wenn der boolesche Template-Parameter true ist. Aber warum betrachtet g ++ dies nicht als SFINAE? Ich denke, dass die Überladungsfehlermeldung von dem Problem herrührt, dass g ++ die zweite Mitgliedsfunktion nicht löscht und glaubt, dass dies eine Überladung sein sollte.
std::is_same< T, int >::value
und ! std::is_same< T, int >::value
das ergibt das gleiche Ergebnis.