Я не могу выяснить ошибку в коде, может кто-нибудь, пожалуйста, взгляните на нее и помогите мне понять, что я здесь делаю неправильно.
blockquote>Проблема в том, что вы инициализируете статический элемент
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
равным 1template <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); }
Но, честно говоря, я предпочитаю ваш оригинальный (не метапрограммирующий) код.
Вот мой метод быстрого взлома, который я только что сделал, чтобы обойти это.
public static String TimeZoneName(DateTime dt)
{
String sName = TimeZone.CurrentTimeZone.IsDaylightSavingTime(dt)
? TimeZone.CurrentTimeZone.DaylightName
: TimeZone.CurrentTimeZone.StandardName;
String sNewName = "";
String[] sSplit = sName.Split(new char[]{' '});
foreach (String s in sSplit)
if (s.Length >= 1)
sNewName += s.Substring(0, 1);
return sNewName;
}