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;
}
  • Вопрос задан
  • 295 просмотров
Решения вопроса 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);

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

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

Похожие вопросы