Есть такой шаблон.
template<class T>
T maxn(T *, int);
и спецализация для char*
template<> char* maxn(char**, int);
Теперь хотелось бы добавить еще и const, т.е. T maxn(const T *, int);, но после добавления в спецализации const выдается ошибка, т.е. maxn подчеркивается красным.
template<> char* maxn<char*>(const char**, int);
Почему? Кто объяснит?
Специализация шаблона должна соответствовать главному шаблону, который она специализирует.
Во-первых, вы в своей специализации явно указали шаблонный параметр T == char *. Но ваша первая специализация уже была сделана для такого значения параметра T. Невозможно сделать еще одну специализацию для того же самого набора значений параметров. (И с чего это вдруг решили явно указать значение параметра, если в первой специализации вы этого не делали?)
Во-вторых, из значения шаблонного параметра T == char * сразу следует, что параметр функции T * должен иметь тип char **. А у вас написано - const char **. Это уже противоречит главному шаблону.
В-третьих, у вас в главном шаблоне ясно написано, что тип возвращаемого значения связан с типом параметра функции (T и T * соответственно). Это означает, что при типе параметра const char **, возвращаемое значение никак не может быть char *. Это тоже противоречит главному шаблону.
Другими словами, у вашего главного шаблона никак не может быть такой специализации.
Вот такую специализацию вы можете сделать
template<> const char* maxn(const char**, int);
// Она же
// template<> const char* maxn<const char*>(const char**, int);
но никак не то, что у вас сейчас.
А дальше все уже зависит от того, что вы пытаетесь сделать. Из вашего вопроса не ясно, зачем вам понадобилась такая "специализация". Может вам нужна перегрузка, а не специализация?
// Два перегруженных шаблона
template<class T> T maxn(T *, int);
template<class T> T maxn(const T *, int);
или
// Шаблон и перегруженная функция
template<class T> T maxn(T *, int);
char* maxn(const char**, int);
Ну не получив полноценный ответ тут я решил задать тот же вопрос в английском StackOverflow. И мне там ответили
template<>
char* maxn<char*>(char* const *, int);
Вот ссылка на ответ.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей