嘿,我正在用C ++编写一个ArrayList的通用实现,其中一部分是实现MergeSort,但是现在我开始测试它,我遇到了一个奇怪的问题。在我的测试中,我使用int类型来简化,在下面的第二个函数签名中我得到错误:
initializing argument 1 of 'T* ArrayList<T>::mergeSort(T*, int) [with T = int]' [-fpermissive]
然后在第二个函数的递归调用中我得到了这个错误:
invalid conversion from 'int' to 'int*' [-fpermissive]
我不明白为什么它认为我正在尝试从int转换为int ...不应该都是int *类型的?我对C ++很有兴趣,尤其是C ++中的泛型(尽管我精通Java)所以任何有用的指针(没有双关语)都会受到赞赏!
/**
* Runs merge sort on this ArrayList<T>. Interface function to the central,
* recursive, merge sort function.
*/
template<class T>
void ArrayList<T>::mergeSort() {
mergeSort(array, size);
}
/**
* Runs merge sort on the passed in array. Recursive.
*
* @param array the array to sort.
* @param arraySize the size of the array that is to be sorted.
* @return the sorted array.
*/
template<class T>
T* ArrayList<T>::mergeSort(T* array, int arraySize) {
T* returnArray = array;
//If the arraySize isn't 1, recurse. Otherwise return the single element array.
if (arraySize != 1) {
returnArray = new T[arraySize];
//Split arrays further. Recurse.
returnArray = mergeSort(array[0], arraySize / 2);
returnArray += arraySize / 2;
returnArray = mergeSort(array[arraySize / 2], arraySize - (arraySize / 2));
}
return returnArray;
}
答案 0 :(得分:3)
在你的两个递归调用中,你没有传递指针,你在这些索引处传递数组中的值。
if (arraySize != 1) {
returnArray = new T[arraySize];
//Split arrays further. Recurse.
returnArray = mergeSort(array[0], arraySize / 2);
returnArray += arraySize / 2;
returnArray = mergeSort(array[arraySize / 2], arraySize - (arraySize / 2));
}
将递归调用更改为:
returnArray = mergeSort(&array[0], arraySize / 2);
returnArray = mergeSort(&array[arraySize / 2], arraySize - (arraySize / 2));
或:
returnArray = mergeSort(array, arraySize / 2);
returnArray = mergeSort(array + (arraySize / 2), arraySize - (arraySize / 2));
我不清楚您的第一个错误是什么,看起来您已经切断了部分错误消息。