Ошибок в этом коде довольно много.
Начнем с
void swap(T& first, T& second)
.
Она просто не нужна
т.к. есть std::swap
.
template <typename T1>
void out_array(const T1* array, size_t arraySize)
Параметр
arraySize
тоже не нужен. Ты работаешь с сырыми массивами фиксированной длины и можешь дать своему шаблону функции понимание длины такого массива. Делается это так.
template < typename TElementType, size_t LENGTH >
void out_array( const TElementType array[ LENGTH ] )
Далее.
char array2[n] = { '2','1','4','5','3','-3','-1','-2','-4','-5' };
В этом месте сразу две ошибки. Первая - это инициализация символьными литералами.
'2'
не будет эквивалентно
2
. С этого момента сортировка будет сортировать по коду символьной таблицы, а не по значению числа. Это ошибка, т.к. это явно не то поведение, которое ты ждешь.
Вторая ошибка - это
'-3'
и.т.д. Тип у такой конструкции будет
int
, а не
char
. Компилятор тебе именно об этом и пытается сказать.
int array3[n] = atoi(array2);
Эту конструкцию сложно понять. Сказать можно одно - так массив фиксированной длины инициализировать не получится.
Если этой конструкцией ты хотел описать инициализацию массива, то это можно попробовать сделать вот так:
int array3[n];
std::transform(
std::begin( array2 ), std::end( array2 ), std::begin( array3 ),
[]( const char item ) -> int { return item; }
);
Но это тоже скользкое решение. В твоем случае все будет нормально, в общем случае это плохое решение. Изучи
документацию на функцию
std::transform
.