2012-08-07 68 views
1

嘿,我正在C++中製作一個ArrayList的通用實現,其中一部分正在實現MergeSort,但現在我已經開始測試它,我遇到了一個奇怪的問題。在我的測試中我使用int類型爲簡單起見,和下面的第二個函數簽名,我發現了錯誤:C++指針使用模板時出錯

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; 
} 

回答

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, arraySize/2); 
returnArray = mergeSort(array + (arraySize/2), arraySize - (arraySize/2)); 

我不是你的第一個錯誤是什麼明確的,它看起來像你剪了錯誤消息的一部分。

+0

第一個錯誤是完整的,但是當我解決這兩個問題時它就消失了。 Geeze我很笨,我忘了操作員的地址....感謝您抽出時間糾正我的錯誤。 – Ethan 2012-08-07 00:18:29

+0

沒問題,快樂編碼! – 2012-08-07 00:19:09