1

誰かがこれを手伝ってくれるかどうか疑問に思っています。以下のコードでこのエラーが発生しています: 致命的なエラー C1903: 以前のエラーから回復できません。コンパイルの停止

template <class T>
class CompareList
{
public:

    CompareList( const long& lBlobFeature, const bool& bIsAscending )
{
    ...
}


bool operator()( T &lhs, T &rhs ) 
{

    double dFirstValue  = lhs.GetValue( ... );
    double dSecondValue = rhs.GetValue( ... );


    if( m_bIsAscending )   // Sort Ascending.
    {
        if( dFirstValue < dSecondValue )
            return true;
        else 
            return false;
    }
    else                   // Sort Descending.
    {
        if( dFirstValue > dSecondValue )
            return true;
        else 
            return false;
    }
}

};


CVParentList     *m_pList;
m_pList = new CVChildList[ nBlobs ]; //CVChildList is a derived class of CVParentList

std::sort( m_pList, m_pList+GetBlobsNumber(), CompareList <CVChildList> ( lBlobFeature, TRUE) );

編集: 本当に申し訳ありませんが、実際にはこれが最初のエラーです: エラー C2664: 'bool CompareList ::operator ()(T &,T &)' : パラメーター 1 を 'CVParentList' から 'CVChildList &' に変換できません

「致命的なエラー C1903: 以前のエラーから回復できません; コンパイルを停止しています」というメッセージが表示され、最後のエラー メッセージしか表示されませんでした。ごめんなさい。

4

2 に答える 2

1

const比較によって比較対象のオブジェクトが変更されることはないため、ファンクターへの参照を渡す必要がある可能性があります。コンパイラはこれを必要とする場合と必要としない場合があります。ファンクターの署名をに変更します

bool operator()(const  T& lhs, const T& rhs ); 
于 2012-10-30T08:44:05.707 に答える
1

コンパレーターまたは動的リスト。変える必要がある。コンパレーターのテンプレート部分を捨てて、単純に CVParentList コンパレーターとして宣言することができます。

class CompareList
{
public:
    CompareList(long lBlobFeature, bool isAscending);

    bool operator()(const CVParentList& left, const CVParentList& right) const
    {
        bool ans = false;
        // your comparison code goes here
        return ans;
    }
private:
    bool m_bIsAscending;
};

テンプレート引数なしで行っているように、 std::sort<> を呼び出します

std::sort( m_pList, m_pList+GetBlobsNumber(), CompareList( lBlobFeature, TRUE) );

リストを割り当ててソートし、完了したらリストの先頭をダウンキャストすることもできます。

CVParentList *m_pList = new CVChildList[ nBlobs ];
std::sort( (CVChildList *)m_pList, (CVChildList *)m_pList+GetBlobsNumber(), CompareList<CVChildList> ( lBlobFeature, TRUE) );

しかし、あなたの場合は最初のオプションを本当にお勧めします。

于 2012-10-30T10:17:36.830 に答える