J'essaie de faire travailler un exemple simple pour comprendre comment l'utiliser std::enable_if
. Après avoir lu cette réponse , j'ai pensé qu'il ne devrait pas être trop difficile de trouver un exemple simple. Je veux utiliser std::enable_if
pour choisir entre deux fonctions membres et n'autoriser qu'une seule d'entre elles à être utilisée.
Malheureusement, ce qui suit ne se compile pas avec gcc 4.7 et après des heures et des heures d'essais, je vous demande quelle est mon erreur.
#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 signale les problèmes suivants:
% 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()'
Pourquoi g ++ ne supprime-t-il pas la mauvaise instanciation pour la deuxième fonction membre? Selon la norme, std::enable_if< bool, T = void >::type
n'existe que lorsque le paramètre de modèle booléen est vrai. Mais pourquoi g ++ ne considère-t-il pas cela comme SFINAE? Je pense que le message d'erreur de surcharge vient du problème que g ++ ne supprime pas la fonction du deuxième membre et pense que cela devrait être une surcharge.
std::is_same< T, int >::value
et ! std::is_same< T, int >::value
qui donne le même résultat.