Обратите внимание, что квалификатор верхнего уровня const
игнорируется для типа параметра, поэтому специализация
template <> void foo (char const * const) {}
так же, как
template <> void foo (char const *) {}
, которая является специализированной версией для foo<char const *, void>
, а не foo<char const * const, void>
(как вы ожидали).
В качестве обходного пути вы можете сопоставить вызов и специализацию, например, явно измените специализацию на
template <> void foo<char const * const, void> (char const * const) {}
или измените вызов на
foo<char const *, void>(data);