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 &)' : cannot convert parameter 1 from 'CVParentList' to '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 回答