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