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];
因为 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);
,现在它可以完美运行了。
对于学校,我有一个作业要创建函数模板并使用用户输入进行动态记忆。我的代码不工作,但我的老师说它是正确的,只是我的编译器不工作。这是我从编译器得到的错误:
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];
因为 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);
,现在它可以完美运行了。