Специализация шаблона функций со ссылкой на указатель

У меня есть функция шаблона:

template<typename T>
void foo(const T& value) { bar(value); x = -1; }

Я хочу специализировать его для набора типов:

template<>
void foo<char>(const char& value) { bar(value); x = 0; }
template<>
void foo<unsigned char>(const unsigned char& value) { bar(value); x = 1; }

Он работает нормально. Когда я скомпилирую это:

template<>
void foo<char*>(const char*& value) { bar(value); x = 2; }

Я получаю сообщение об ошибке:

error C2912: explicit specialization; 'void foo(const char *&)' is not a specialization of a function template

Можно ли специализироваться с параметром типа указателя char* без его удаления?

Ответ 1

Конечно. Попробуйте следующее:

template<>
void foo<char*>(char* const& value) {...}

Это потому, что const char* означает указатель на const char, а не указатель const на char.