Есть следующие классы:
class CMyObj
{
public:
CMyObj(void);
CMyObj(int id){}
~CMyObj(void);
int getTime(){return time;}
int getID(){return ID;}
private:
int ID;
int time;
};
//---------------------------------------------------------------------
class CMyCore
{
public:
CMyCore();
~CMyCore();
bool addObject(CMyObj* obj){ objects.push_back(obj);return 1;}
bool removeObject(int id){};
bool queryObjects();
#ifdef DEBUG
void printState();
#endif
private:
list<CMyObj*> objects;
list<CMyObj*>::iterator objIter;
};
Необходимо отсортировать список объектов objects по времени(time)
Использую следующий код:
bool operator <(CMyObj& a,CMyObj& b)
{
if (a.getTime()>b.getTime()) return true;
return false;
}
//…
objects.sort(operator <);
//…
Получаю ошибку компилятора в <list> d:\Microsoft Visual Studio .NET\Vc7\include\list(735): error C2664: 'bool (CMyObj &,CMyObj &

' : cannot convert parameter 2 from 'CMyObj *' to 'CMyObj &'
d:\Microsoft Visual Studio .NET\Vc7\include\list(735): error C2664: 'bool (CMyObj &,CMyObj &

' : cannot convert parameter 1 from 'CMyObj *' to 'CMyObj &'
Если objects объявить как
list<CMyObj> objects;
list<CMyObj>::iterator objIter;
Все работает и прекрасно сортирует. Но очевидно ,что хранить сами объекты это не дело,
если мне нужно их только опрашивать .
При попытке объявить
bool operator <(CMyObj* a,CMyObj* b)
{
if (a.getTime()>b.getTime()) return true;
return false;
}
e:\MyCore.cpp(8): error C2803: 'operator <' must have at least one formal parameter of class type
Что подскажете?
Здравствуйте, vovaiv12, Вы писали:
V>Есть следующие классы:
V>Необходимо отсортировать список объектов objects по времени(time)
V>Что подскажете?
Не уверен в качестве такого решения, но я делал так:
template<class _Ty, class _f>
struct myGreater : std::greater<_Ty> {
bool operator()(const _Ty& _X, const _Ty& _Y) const
{return (_X->_f() > _Y->_f()); }
};
...
void myClass::Sort()
{
myGreater<CMyObj*, time> my_greater;
objects.sort( my_greater )
}
ошибочка, вместо
{return (_X->_f() > _Y->_f()); }
должно быть
{return (_X->_f > _Y->_f); }
Здравствуйте, vovaiv12, Вы писали:
V>Необходимо отсортировать список объектов objects по времени(time)
Первое: насколько видно из постановки, речь идет о
списке указателей на объекты. Решается эта задача с помощью встроенного алгоритма
template <class Pred>
std::list<T>::sort(Pred pr)
для использования которого нужен предикат. В твоем случае этот предикат можно сделать так:
struct my_pred
{
bool operator() const (const CMyObj* lp, const CMyObj* rp) { return lp->getTime() > rp->getTime(); }
};
Использование:
objects.sort(my_pred());
Второе: речь все-таки идет о VC7. Если же эта функциональность нужна для VC 6, то с его "родной" STL решить эту проблему нельзя из-за кривой реализации встроенного алгоритма sort с предикатом (это решается путем прикручивания STLPort)
Здравствуйте, Bell, Вы писали:
B>Второе: речь все-таки идет о VC7. Если же эта функциональность нужна для VC 6, то с его "родной" STL решить эту проблему нельзя из-за кривой реализации встроенного алгоритма sort с предикатом (это решается путем прикручивания STLPort)
Или исправлением багов Dinkumware STL (
http://www.dinkumware.com/vc_fixes.html) ?