Помогите понять, gcc при попытке скомпилировать нижеследующий код выдаёт ошибку (gcc: specialization for stops the recursion):
#include <iostream>
using namespace std;
// хотим определить рекурсивный сдвиг ОТРИЦАТЕЛЬНОГО параметра через шаблон:
template<typename T, T t, int shift = 1, bool stop = (t >> shift) < 0>
struct shift_right {
typedef shift_right<T, t, shift + 1, (t >> (shift + 1)) < 0> SR;
static const int n = SR::n; // next shift iteration by define the recursive template
};
template<typename T, T t, int shift> // specialization for stops recursion
struct shift_right<T, t, shift, false> {
static const int n = shift;
};
int main()
{
cout << "n = " << shift_right<int, -65535>::n << endl; // Print shifted bits of T = int, T t = -65535
return 0;
}
Хотя, если поставить вместо сравнения с 0 сравнение с -1, то работает:
typedef shift_right<T, t, shift + 1, (t >> (shift + 1)) < -1> SR;
Проверялка online:
http://www.tutorialspoint.com/compile_cpp_online.php