Я не могу выяснить ошибку в коде, может кто-нибудь, пожалуйста, взгляните на нее и помогите мне понять, что я здесь делаю неправильно.
Проблемаявляется то, что вы инициализируете статический член cnt
следующим образом
template <size_t N>
size_t RLE<N>::cnt = 1 + RLE<N - 1>::cnt;
size_t RLE<0>::cnt = 0;
, поэтому вы получаете cnt == N
, когда компилятор использует инициализированное значение RLE<N - 1>::cnt
(случай g ++), cnt == 1
при N > 0
когда компилятор использует ноль для RLE<N - 1>::cnt
(случай clang ++).
Я не знаю, кто прав, но дело в том, что когда вы пишете
cout << cnt << *p;
cnt = 0;
, вы печатаете cnt
в RLE<N>
- то есть N
или 1
, в зависимости от случая - и вы устанавливаете в ноль cnt
в RLE<N>
.
Но когда вы устанавливаете в ноль cnt
в RLE<N>
, cnt
в RLE<N-1>
остаются неизменными (поэтому N-1
или 1
, в зависимости от случая).
Я не вижу много метапрограммирования в вашем коде, но мне кажется,что возможная коррекция установлена для всех cnt
на 1
template <size_t N>
size_t RLE<N>::cnt = 1;
size_t RLE<0>::cnt = 1;
и для RNE<N-1>::cnt
как cnt + 1
в Compress()
static void Compress(char const p[])
{
if (!(*p == *(p + 1)))
{
cout << cnt << *p;
cnt = 0u;
}
RLE<N - 1>::cnt = cnt+1u; <--- add this line
RLE<N - 1>::Compress(p + 1);
}
Но, честно говоря, я предпочитаю вашоригинал (не метапрограммирование) код.