Right Shift Operator in Template Param (правый сдвиг в парам
От: chertnot  
Дата: 24.05.15 21:45
Оценка:
Помогите понять, 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
Отредактировано 24.05.2015 21:48 chertnot . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.