Шаблоны функций в C++?

Для школы у меня есть задание создать шаблон функции и использовать пользовательский ввод для динамической памяти. Мой код не работает, но мой учитель говорит, что он правильный, и не работает только мой компилятор. Это ошибка, которую я получаю от компилятора:

ошибка: неверное преобразование из int в int* -fpermissive key = array[I];

Я использую компилятор MinGW64. Есть ли кто-нибудь с такой же проблемой, у кого есть решение?

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

template <class S>  
void sortArray(S &array, int n);

template <class R>
void reverseArray(R &array, int n);

template <class P>
void printArray(P array, int n);

int main() {
    int n1, n2, i;

    srand(time(0));

    cout << "insert how many numbers:";
    cin >> n1;
    int *nums = new int[n1];
    if(nums == 0){
        cout << "No memory allocated";
        exit(1);
    }
    for(i = 0; i < n1; i++){
        nums[i] = rand() % 100 + 1;
    }
    printArray(nums, n1);
    sortArray(nums, n1);
    printArray(nums, n1);
    reverseArray(nums, n1);
    printArray(nums, n1);
    delete []nums;

    cout << "insert how many characters:";
    cin >> n2;
    char *nums2 = new char[n2];
    if(nums2 == 0){
        cout << "No memory allocated";
        exit(1);
    }
    for(i = 0; i < n2; i++){
        nums2[i] =  rand() % 25 + 97; // rand() % 93 + 33
    }
    printArray(nums2, n2);
    sortArray(nums2, n2);
    printArray(nums2, n2);
    reverseArray(nums2, n2);
    printArray(nums2, n2);
    delete []nums2;

    return 0;
}

template <class S>
void sortArray(S &array, int n){
    int i, j;
    S key;
    for(i = 1; i < n; i++){
        key = array[i];
        for(j = i-1; (j>=0) && (array[j] > key); j--){
             array[j+1] = array[j];
        }
        array[j+1] = key;
    }
}

template <class R>
void reverseArray(R &array, int n){
    int start = 0, end = n-1;
    R temp;
    while(start < end){
        temp = array[start];
        array[start] = array[end];
        array[end] = temp;
        start++;
        end--;
    }
}

template <class P>
void printArray(P array, int n){
    int i;
    for (i = 0; i < n; ++i) {
         cout << "[" <<i << "] => " << array[i] << ", ";
    }
    cout << endl;
}

2 ответа

Решение

Компилятор определенно не ошибается.

Есть некоторое недопонимание.

Когда вы объявляете

template <class S>  
void sortArray(S &array, int n);

и просто

sortArray(nums, n1);

S выводится как int* учитывая определение nums в вашем опубликованном коде. Следовательно, вы не можете использовать

S key;
for(i = 1; i < n; i++){
    key = array[i];

поскольку key имеет тип int* в то время как array[i] имеет тип int,

Вы можете решить проблему, используя один из следующих двух вариантов.

  1. Измените объявление функции на

    template <class S>  
    void sortArray(S* array, int n);
    
  2. Изменить тип key,

    typename std::remove_reference<decltype(*array)>::type key;
    

    или пусть компилятор выведет это используя auto,

    auto key = array[0];
    

    Недостатком использования второго метода является то, что программа будет иметь неопределенное поведение, если array пустой.

Вам придется изменить reverseArray так же.

Спасибо за всю информацию. Мой учитель не помог бы мне, потому что он был убежден, что это был мой компилятор.
Так что все, что мне нужно было сделать, это изменить объявление функции на void sortArray(S *array, int n); и теперь работает отлично.

Другие вопросы по тегам