У меня есть следующий код для сортировки вектора настраиваемого типа. Он работал, но после создания кода в другой системе он дает ошибку во время компиляции.Неверная инициализация типа при использовании сортировки
Контент вызова sort().
std::vector<std::vector<AssemblyObject>>* LegoAssembler::getLayers(std::vector<AssemblyObject> completeAssembly)
{
std::vector<std::vector<AssemblyObject>>* layers = new std::vector<std::vector<AssemblyObject>>();
std::vector<AssemblyObject> cLayer;
double lastZ = 0;
std::sort(completeAssembly.begin(), completeAssembly.end(), AssemblyObject::compare);
...
}
Функция сортировки
bool AssemblyObject::compare(AssemblyObject &a, AssemblyObject &b){
return (a.getPosition()[2] < b.getPosition()[2]) ||
((a.getPosition()[2] == b.getPosition()[2]) && (a.getPosition()[1] > b.getPosition()[1])) ||
((a.getPosition()[2] == b.getPosition()[2]) && (a.getPosition()[1] == b.getPosition()[1]) && (a.getPosition()[0] > b.getPosition()[0]));
}
Ошибка
/usr/include/c++/4.8/bits/stl_algo.h:2263: error: invalid initialization of reference of type ‘AssemblyObject&’ from expression of type ‘const AssemblyObject’
while (__comp(*__first, __pivot))
/usr/include/c++/4.8/bits/stl_algo.h:2263: error: invalid initialization of reference of type ‘AssemblyObject&’ from expression of type ‘const AssemblyObject’
while (__comp(*__first, __pivot))
^
^
Как я уже говорил, это произошло после того, как строить код на другой системе. Я думал, что это как-то связано с изменением версий компилятора, но опять же, я думаю, что что-то простое, как функция сортировки, не сломается. Плюс я бы хотел, чтобы код компилировался на обоих компиляторах, если это так.
Действительно был бы признателен за помощь,
* «Я думаю, что что-то же просто, как функция сортировки не будет нарушать» * - Если вы не» t следуют предварительным условиям алгоритма, он имеет полное право разбиться. В частности, обратите внимание на требование [прототипа компаратора] (http://en.cppreference.com/w/cpp/algorithm/sort) – StoryTeller
Я бы не стал уделять слишком много внимания тому факту, что он работал над другим компилятором , Его не редкость для компиляторов принимать вещи, которые они технически не должны, а другие компиляторы или более поздние версии одного и того же компилятора могут быть более строгими. Кроме того, вы должны вернуть вектор самих векторов, а не указатель на него, который был выделен вручную. – RyanP
@ RyanP Спасибо за подсказку, сохранит это в виду в будущем. –