Шаблоны и явная специализация. C++

209
25 сентября 2018, 11:00

Есть такой шаблон.

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);

Почему? Кто объяснит?

Answer 1

Специализация шаблона должна соответствовать главному шаблону, который она специализирует.

Во-первых, вы в своей специализации явно указали шаблонный параметр 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);
Answer 2

Ну не получив полноценный ответ тут я решил задать тот же вопрос в английском StackOverflow. И мне там ответили

template<>
char* maxn<char*>(char* const *, int);

Вот ссылка на ответ.

READ ALSO
Копируется пустой файл

Копируется пустой файл

У меня копируется пустой файлХотя до копирования я его создаю и наполняю содержимым

243
Статическая библиотека и флаги для CRT

Статическая библиотека и флаги для CRT

Очень неожиданный для меня вопросВ Visual Studio есть проект статической библиотеки (*

214
Как задать разрешение в Android 5.1.1 и меньше

Как задать разрешение в Android 5.1.1 и меньше

Использую данный код чтобы спрашивал разрешение на телефонах

180
VPN клиент Андроид Java

VPN клиент Андроид Java

У меня есть небольшой опыт в разработки приложений но с такой штукой как тунелирование я еще не встречалсяИ встала такая задача

275