Russian Qt Forum
Ноябрь 22, 2024, 22:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка с std::list  (Прочитано 4907 раз)
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)
                 ^

Вопрос: че ему не так?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 11, 2015, 13:40 »

У BoostPolygon не определены операторы сравнения.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
phpCoder
Гость
« Ответ #2 : Август 11, 2015, 13:53 »

Мде.. А говорят, что boost крутой...
Хорошо, может Вы знаете, как тогда из std::list удалить какие объекты, которые не имеют оперов сравнения?
Записан
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« Ответ #3 : Август 11, 2015, 14:02 »

А почему бы не хранить в списке вместо объектов указатели на них?
Записан
phpCoder
Гость
« Ответ #4 : Август 11, 2015, 14:21 »

Массив results, который принимает бустовская функция и модифицирует, содержит объекты. Поэтому с объектами и работаю. А как можно перегнать объект в указатель на него так, чтобы после завершения работы функции эти указатели ссылались на корректные объекты, а не на мусор?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Август 11, 2015, 14:25 »

Просто класть в контейнер обычные указатели
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Август 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
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #7 : Август 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)

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Август 13, 2015, 08:45 »

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

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


Страница сгенерирована за 0.176 секунд. Запросов: 23.