1

ちょっと私は C++ で ArrayList の汎用実装を作成しており、その一部は MergeSort を実装していますが、テストを開始した今、奇妙な問題に遭遇しています。私のテストでは、簡単にするために int 型を使用していますが、以下の 2 番目の関数シグネチャでエラーが発生しています。

initializing argument 1 of 'T* ArrayList<T>::mergeSort(T*, int) [with T = int]' [-fpermissive]

次に、2 番目の関数の再帰呼び出しで、次のエラーが発生します。

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

1 に答える 1

3

2 つの再帰呼び出しでは、ポインターを渡すのではなく、それらのインデックスで配列内の値を渡します。

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

最初のエラーが何であるかはっきりしません。エラー メッセージの一部が切り取られているようです。

于 2012-08-07T00:13:13.150 に答える