Madara337
@Madara337
NoName

Ошибка при создании явной специализации. В чём ошибка?

Делаю 6 упражнение 8 главы книги "Язык программирования C++" Стивен Пратта

Напишите шаблонную функцию maxn(), которая принимает в качестве
аргумента массив элементов типа т и целое число, представляющее количество
элементов в массиве, а возвращает элемент с наибольшим значением. Протестируйте
ее работу в программе, которая использует этот шаблон с массивом из шести
значений int и массивом из четырех значений double.
Программа также должна включать специализацию, которая использует массив указателей на char в
качестве первого аргумента и количество указателей — в качестве второго, а затем
возвращает адрес самой длинной строки. Если имеется более одной строки
наибольшей длины, функция должна вернуть адрес первой из них. Протестируйте
специализацию на массиве из пяти указателей на строки.

у меня выходит ошибка в VS19 :no instance of function template "maxn" matches the specified type.
Что я не так делаю?

#include <iostream>

template <typename T>
T maxn(T arr[], int arrSize);

template <> char* maxn(const char *arr[], int arrSize);

int main()
{
	return 0;
}

template <typename T>
T maxn(T arr[], int arrSize)
{
	T max = arr[0];
	for (int i = 1; i < arrSize; i++)
		if (arr[i] > max)
			max = arr[i];

	return max;
}

template <> char* maxn(const char* arr[], int arrSize)
{
	char* line = arr[0];

	for (int i = 0; i < arrSize; i++)
		if (strlen(arr[i]) > strlen(line))
			line = arr[i];

	return line;
}
  • Вопрос задан
  • 250 просмотров
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
template <typename T>
T maxn(T arr[], int arrSize);

Это - общая форма шаблона функции. Если тебе нужно сделать явную специализацию шаблона, твоя явная специализация должна соответствовать этому общему шаблону.

template <>
const char* maxn(const char* arr[], int arrSize);

Сырые однобайтовые строки в C++ (при соблюдении правила нуль-терминации) определяются типом char* или const char* если строку не планируется модифицировать. Наша функция не планирует модифицировать строки, следовательно явная специализация шаблона должна работать с типом const char*.
Тип const char* должен быть подставлен везде вместо параметра шаблона T.

Таким образом явная специализация шаблона для сырых строк будет полностью соответствовать общему шаблону функции.

А теперь немного о твоей ошибке.
template <> char* maxn(const char *arr[], int arrSize);

Это объявление не является явной специализацией приведенного выше шаблона. Это - определение перегрузки функции через явную специализацию какого-то иного неописанного шаблона. Это потому что результат функции char* отличен от параметра функции const char*.
В целом, эта запись является плохо сформулированной (ill-formed) по целому ряду причин, включая и то, что перегрузка не может осуществляться через изменение типа результата функции.

В целях обучения я советую не опускать перечисление аргументов явной специализации шаблона:
template <>
const char* maxn<const char*>(const char* arr[], int arrSize);

Благодаря этому простому шагу ты сообщишь компилятору больше информации о том, что ты хочешь сказать своим кодом и он тебя лучше поймет. В результате компилятор сможет поправить тебя там, где ты ошибся при описании явной специализации.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы