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 *に変換できないと文句を言うまでは、問題はありません。テンプレートによってSwap関数がタイプPfreq*で呼び出されるという問題を解決する方法が完全にはわかりません。

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;

問題は、sの配列やへのポインタではなく、itemSwapへの参照であるということです。そのパラメータをに変更してみて、それで問題が解決するかどうかを確認してください。ItemTypeItemTypeItemTypeItemType*

お役に立てれば!

于 2012-04-17T23:58:50.800 に答える