2

我正在尝试使用堆来实现一个模板化的优先级队列来处理图像中像素的频率。它工作得很好,但是当我尝试通过将另一个类作为模板参数传递来使用它时,它最终会在尝试向下或向上重新堆时将该类转换为指向该类的指针。这是堆规范:

template <typename ItemType>
struct HeapType
{
    void ReheapDown(int, int);
    void ReheapUp(int, int);
    ItemType *elements;
    int numElements;
};

重新堆放功能:

template<typename ItemType>
void HeapType<ItemType>::ReheapDown(int root, int bottom)
{
    int maxChild, rightChild, leftChild;
    leftChild = 2*root+1;
    rightChild = 2*root+2;

    if(leftChild <= bottom)
    {
        if(leftChild == bottom)
        {
            maxChild = leftChild;
        }
        else
        {
            if(elements[leftChild] <= elements[rightChild])
                maxChild = rightChild;
            else
                maxChild = leftChild;
        }
        if(elements[root] < elements[maxChild])
        {
            Swap(elements, root, maxChild);
            ReheapDown(maxChild, bottom);
        }
    }
}

和交换功能:

template<typename ItemType>
void Swap(ItemType &itemSwap, int swapFrom, int swapTo)
{
    ItemType tempItem;
    tempItem = itemSwap[swapFrom];
    itemSwap[swapFrom] = itemSwap[swapTo];
    itemSwap[swapTo] = tempItem;
}

因此,我使用名为 Pfreq 的辅助类来实现优先级队列,该类重载比较运算符,以便堆按像素的频率而不是像素的值进行排序。它没有问题,直到它到达 Swap 函数,然后抱怨它不能将类型从 Pfreq 转换为 Pfreq*。我不完全确定如何解决模板导致使用 Pfreq* 类型调用 Swap 函数的问题。

4

1 回答 1

2

我认为问题在于这个函数的声明:

template<typename ItemType>
    void Swap(ItemType &itemSwap, int swapFrom, int swapTo)

您正在尝试将第一个参数用作数组,如下所示:

ItemType tempItem;
tempItem = itemSwap[swapFrom];
itemSwap[swapFrom] = itemSwap[swapTo];
itemSwap[swapTo] = tempItem;

问题是它itemSwap是对 an 的引用ItemType,而不是ItemTypes 的数组或指向 an 的指针ItemType。尝试将该参数更改为 anItemType*并查看是否可以解决问题。

希望这可以帮助!

于 2012-04-17T23:58:50.800 回答