J'essaie d'utiliser std::enable_if
avec un paramètre de type inutilisé et sans nom, afin de ne pas fausser le fonctionnement du return
type. Cependant, le code suivant ne se compile pas.
#include <iostream>
template <typename T, typename = std::enable_if_t<!std::is_integral<T>::value>>
T foo() { std::cout << "non-integral" << std::endl; return T(); }
template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
T foo() { std::cout << "integral" << std::endl; return T(); }
int main() {
foo<float>();
foo<int>();
}
Le compilateur dit :
7:3: error: redefinition of 'template<class T, class> T foo()'
4:3: note: 'template<class T, class> T foo()' previously declared here
In function 'int main()':
11:12: error: no matching function for call to 'foo()'
11:12: note: candidate is:
4:3: note: template<class T, class> T foo()
4:3: note: template argument deduction/substitution failed:
Quel est le problème ? Comment dois-je modifier le code pour qu'il compile ? Le manuel "Discovering Modern C++" encourage explicitement l'utilisation de std::enable_if
avec des paramètres de type anonyme.
EDIT : Je sais que cela fonctionne si je mets std::enable_if
dans le type de retour. Cependant, mon intention est d'obtenir plus de détails sur la raison pour laquelle cela ne fonctionne pas si je l'utilise avec des paramètres de type anonyme. Comme je l'ai dit, mon manuel encourage la variante utilisant des paramètres de type anonyme, et je me demande donc pourquoi mon code ne compile pas.