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

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

0 голосов
/ 20 сентября 2018

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

ошибка: недопустимое преобразование из 'int' в 'int *' [-fpermissive] ключ = массив [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 ]

0 голосов
/ 20 сентября 2018

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

0 голосов
/ 20 сентября 2018

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

Существует некоторое недопонимание.

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

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 аналогично.

...