Russian Qt Forum

Программирование => С/C++ => Тема начата: phpCoder от Август 11, 2015, 13:02



Название: Ошибка с std::list
Отправлено: phpCoder от Август 11, 2015, 13:02
Добрый день.
C++ опять парит.
Код
C++ (Qt)
void Polygon::cut(const Polygon &cutter)
{
   if(_cutList.empty()) return;
 
   std::list<BoostPolygon> result;
   foreach(const BoostPolygon &target, _cutList)
   {
       if(!boost::geometry::intersection(cutter._polygon, target, result)) continue;
       _resultList.merge(result); // парит мерг
       boost::geometry::difference(cutter._polygon, target, result);
       if(result.empty()) continue;
       _cutList.remove(target); // парит ремув
       _cutList.merge(result); // парит мерг
   }
}
В тех местах, где комменты выдает мне:
Мерг: C:\Qt\Qt5.5.0\Tools\mingw492_32\i686-w64-mingw32\include\c++\bits\list.tcc:346: ошибка: no match for 'operator<' (operand types are 'boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> >' and 'boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> >')
      if (*__first2 < *__first1)
                    ^

Ремув: C:\Qt\Qt5.5.0\Tools\mingw492_32\i686-w64-mingw32\include\c++\bits\list.tcc:290: ошибка: no match for 'operator==' (operand types are 'boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> >' and 'const value_type {aka const boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> >}')
    if (*__first == __value)
                 ^

Вопрос: че ему не так?


Название: Re: Ошибка с std::list
Отправлено: Пантер от Август 11, 2015, 13:40
У BoostPolygon не определены операторы сравнения.


Название: Re: Ошибка с std::list
Отправлено: phpCoder от Август 11, 2015, 13:53
Мде.. А говорят, что boost крутой...
Хорошо, может Вы знаете, как тогда из std::list удалить какие объекты, которые не имеют оперов сравнения?


Название: Re: Ошибка с std::list
Отправлено: ksk- от Август 11, 2015, 14:02
А почему бы не хранить в списке вместо объектов указатели на них?


Название: Re: Ошибка с std::list
Отправлено: phpCoder от Август 11, 2015, 14:21
Массив results, который принимает бустовская функция и модифицирует, содержит объекты. Поэтому с объектами и работаю. А как можно перегнать объект в указатель на него так, чтобы после завершения работы функции эти указатели ссылались на корректные объекты, а не на мусор?


Название: Re: Ошибка с std::list
Отправлено: __Heaven__ от Август 11, 2015, 14:25
Просто класть в контейнер обычные указатели


Название: Re: Ошибка с std::list
Отправлено: Igors от Август 11, 2015, 14:34
Мде.. А говорят, что boost крутой...
Ну вообще-то да

Хорошо, может Вы знаете, как тогда из std::list удалить какие объекты, которые не имеют оперов сравнения?
merge сливает сортированные листы, оно здесь не к месту. Не надо шиковать с foreach, скромно итератором перебирайте и по итератору удаляйте, псевдокод
Код
C++ (Qt)
it = lst.begin();
while (it != lst.end()) {
...
bool shouldDel = ...
...
if (shouldDel)
 lst.erase(it++);
else
 ++it;
}
И вообще в ГИС'ах спрашивайте  :)

А почему бы не хранить в списке вместо объектов указатели на них?
Потому что противоречит идее std::list


Название: Re: Ошибка с std::list
Отправлено: _Bers от Август 13, 2015, 00:33
Мде.. А говорят, что boost крутой...
Хорошо, может Вы знаете, как тогда из std::list удалить какие объекты, которые не имеют оперов сравнения?

лист тут не при делах.
ему оператор сравнения не нужен.

проблема у вас с бустом:

Код:
'boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> >' and 'boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> >')
      if (*__first2 < *__first1)



Название: Re: Ошибка с std::list
Отправлено: Igors от Август 13, 2015, 08:45
лист тут не при делах.
ему оператор сравнения не нужен.

проблема у вас с бустом:
std::list здесь хороший выбор контейнера, просто не нужно merge которое требует <. Спокойно собрать все новые в др list а потом splice (то видать не дочитал)