Для начала даже эта функция
template <class T> void printArray(T items, int count) {
T array[5];
for (int i = 0; i < count; i++) {
cout << array[i] << " ";
}
}
не имеет смысла. Объявлен неинициализированный локальный массив array
, который выводится в al oop.
. Функцию можно определить следующим образом
template <class T>
std::ostream & printArray( const T *items, size_t n, std::ostream &os = std::cout )
{
for ( size_t i = 0; i < n; i++ )
{
os << items[i] << ' ';
}
return os;
}
При вызовах функции шаблона sortArray
вот так
sortArray(b, 5);
параметр типа шаблона выводится на тип int *
. Таким образом, это объявление
T t;
эквивалентно
int *t;
, что не имеет смысла.
Также внутри функции, которую вы используете маги c число 5
.
Вот демонстрационная программа, которая показывает, как могут быть определены функции.
#include <iostream>
#include <utility>
template <class T>
void sortArray( T *items, size_t n )
{
for ( size_t last; !( n < 2 ) ; n = last )
{
for ( size_t i = last = 1; i < n; i++ )
{
if ( items[i] < items[i-1] )
{
std::swap( items[i-1], items[i] );
last = i;
}
}
}
}
template <class T>
std::ostream & printArray( const T *items, size_t n, std::ostream &os = std::cout )
{
for ( size_t i = 0; i < n; i++ )
{
os << items[i] << ' ';
}
return os;
}
int main()
{
int a[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
const size_t N = sizeof( a ) / sizeof( *a );
printArray( a, N ) << '\n';
sortArray( a, N );
printArray( a, N ) << '\n';
return 0;
}
Вывод программы:
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9