Usando std :: enable_if com parâmetros de tipo anônimo

Eu tento usarstd::enable_if com um parâmetro de tipo não utilizado e sem nome, para não distorcer oreturn tipo. No entanto, o código a seguir não compila.

#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>();
}

O compilador diz:

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:

Qual é o problema aqui? Como preciso alterar o código para compilá-lo? O livro "Discovering Modern C ++" encoraja explicitamente o uso destd::enable_if com parâmetros de tipo anônimo.

EDIT: Eu sei que funciona se eu colocarstd::enable_if no tipo de retorno. No entanto, minha intenção é obter mais detalhes sobre por que não funciona se eu usá-lo com parâmetros de tipo anônimo. Como eu disse, meu livro de texto incentiva a variante usando parâmetros de tipo anônimo, por isso estou me perguntando por que meu código não é compilado.

questionAnswers(4)

yourAnswerToTheQuestion