C ++中的函数模板?

Function templates in c++?

对于学校,我有一个作业要创建函数模板并使用用户输入进行动态记忆。我的代码不工作,但我的老师说它是正确的,只是我的编译器不工作。这是我从编译器得到的错误:

error: invalid conversion from 'int' to '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;
}

编译器绝对没有错

有些沟通不畅。

当你申报时

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

并将其设为

sortArray(nums, n1);
根据您发布的代码中 nums 的定义,

S 被推断为 int*。因此,您不能使用

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

因为 keyint* 类型,而 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);,现在它可以完美运行了。