【问题标题】:C++ Pointers Error when using Templates使用模板时出现 C++ 指针错误
【发布时间】:2012-08-07 00:03:54
【问题描述】:

嘿,我正在用 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;
}

【问题讨论】:

    标签: c++ templates generics pointers stl


    【解决方案1】:

    在您的两个递归调用中,您不是在传递指针,而是在这些索引处传递数组中的值。

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

    我不清楚你的第一个错误是什么,看起来你已经切断了部分错误信息。

    【讨论】:

    • 第一个错误已经完成,但是当我解决了这两个错误时它就消失了。哎呀我很笨,我忘记了操作员的地址....感谢您花时间纠正我的错误。
    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2021-06-10
    相关资源
    最近更新 更多