画像内のピクセルの頻度を処理するためにヒープを使用して、テンプレート化された優先度キューを実装しようとしています。正常に動作しますが、テンプレート引数として別のクラスを渡して使用しようとすると、再ヒープまたはアップを試みているときに、クラスがクラスへのポインターに変換されてしまいます。ヒープの仕様は次のとおりです。
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 *に変換できないと文句を言うまでは、問題はありません。テンプレートによってSwap関数がタイプPfreq*で呼び出されるという問題を解決する方法が完全にはわかりません。