Я делаю С++ 6-е издание, 6-е упражнение 8-й главы. У меня есть вопросы по этому шаблону. Я не знаю, почему он всегда показывает последнюю строку, а не показывает строку максимальной длины.
#include <iostream>
#include <cstring>
//8.6
using namespace std;
template <typename T> T Maxn(T *,int);
template <> char * Maxn<>(char **,int );
int main()
{
double arr_1[5] = { 0.0,3.0,1.0,4.0,5.0 };
cout << "double max: " << Maxn(arr_1,5) << endl;
int arr_2[4] = { 3,4,1,0 };
cout << "int max: " << Maxn(arr_2, 4) << endl;
const char *arr_3[4] = { "sdf","tttq","ttttrrsdss" ,"q12221"};
cout << "char max:" << Maxn(arr_3, 4) << endl;
return 0;
}
template <typename T>
T Maxn(T *p,int n)
{
T max = p[0];
for (int i = 0; i < n; i++)
{
if (p[i] > max)
max = p[i];
}
return max;
}
template <> char * Maxn<>(char **p, int n)
{
char * max = p[0];
for (int i = 0; i < n; i++)
{
if (strlen(p[i]) > strlen(max))
{
max = p[i];
}
}
return max;
}
Я сомневаюсь, что это компилируется. Не только из-за странной попытки объявления шаблона, но и из-за того, что вы отбрасываете const
. Как вы это строите? Вы уверены, что ваша сборка не потерпела неудачу, и вы действительно использовали старый двоичный файл?
Почему у вас есть шаблон, который не заботится о типах? Это не имеет никакого смысла.
Обратите внимание, что ожидаемый параметр — char **
, а arr_3 — типа char const **
.
Это не шаблон, а специализация шаблона. Пожалуйста, покажите также шаблон.
Я добавил весь код сейчас.
Тип arr_3 — const char *
, но не char *
:
const char *arr_3[4] = { "sdf","tttq","ttttrrsdss" ,"q12221"};
, так называется первая реализация Maxn, где strlen
не используется.
Да, понятно... Но как я могу инициировать char *arr_3[4] = { "sdf","tttq","ttttrrsdss","q12221"} без использования const? Я не могу скомпилировать его без const char *.
На самом деле вам не нужна реализация Maxn для char *
. Так что перепишите его для const char *
, и ваш код будет работать так, как вы ожидаете.
Вы должны просто начать использовать отладчик или, как минимум, вы можете посетить свой код с помощью отладки printf. Вы увидите, что ваша специализация char*
никогда не используется!
Причина:
Ваш тип данных для «строк» — const char*
, который лучше подходит для первого шаблона, чем для вашей специализации, поэтому просто называется первая версия шаблона. И это сравнивает теперь адрес строк. Если ваш компилятор помещает строки в порядке, представленном в исходном коде, вы всегда будете видеть в качестве результата последнюю строку, так как она имеет самый высокий адрес.
Просто используйте:
template <> const char * Maxn<>(const char **p, int n)
{
const char * max = p[0];
for (int i = 0; i < n; i++)
{
if (strlen(p[i]) > strlen(max))
{
max = p[i];
}
}
return max;
}
Кстати: в вашем коде есть несколько потоков эффективности. Вы сравниваете на первом шаге два раза одно и то же значение, которое не требуется.
Каким должен быть шаблонный тип? Вам вообще нужен шаблон?