Порядок объявлений имеет значение. Какой бы блок ни появился первым, он не увидит другой блок. Это означает, что когда вы делаете разрешение перегрузки в теле первого блока, второй блок не будет кандидатом. Только объявления, которые видны до этого момента, являются кандидатами (исключая другие детали, такие как ADL, которые здесь не применяются).
Средство исправления довольно простое, добавьте объявления обоих шаблонов функций перед их определением. Таким образом, не имеет значения, что на самом деле определено первым.
template<int N, typename T>
typename enable_if <(N > 0) && (N % 2 == 1), T>::type my_pow(T x);
template<int N, typename T>
typename enable_if <(N > 0) && (N % 2 == 0), T>::type my_pow(T x);
template<int N, typename T> // block1
typename enable_if <(N > 0) && (N % 2 == 1), T>::type my_pow(T x) {
return my_pow<N - 1>(x) * x;
}
template<int N, typename T> // block2
typename enable_if <(N > 0) && (N % 2 == 0), T>::type my_pow(T x) {
T p = my_pow<N / 2>(x);
return p * p;
}