[英]Function templates in c++?
对于学校,我有一个任务来创建功能模板,并将用户输入用于动态内存。 我的代码不起作用,但是老师说这是正确的,只是我的编译器不起作用。 这是我从编译器得到的错误:
错误:从'int'到'int *'的无效转换[-fpermissive]键= 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];
因为key
是int*
类型,而array[i]
是int
类型。
您可以使用以下两个选项之一解决此问题。
将函数声明更改为
template <class S> void sortArray(S* array, int n);
更改key
的类型。
typename std::remove_reference<decltype(*array)>::type key;
或者让编译器使用auto
推断它。
auto key = array[0];
使用第二种方法的缺点是,如果array
为空,则程序将具有未定义的行为。
您必须类似地更改reverseArray
。
感谢您提供的所有信息。 我的老师不会帮助我,因为他坚信这是我的编译器。
所以我要做的就是将函数声明void sortArray(S *array, int n);
现在它可以完美运行了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.