2017-02-02 11 views
0

У меня есть следующий код для сортировки вектора настраиваемого типа. Он работал, но после создания кода в другой системе он дает ошибку во время компиляции.Неверная инициализация типа при использовании сортировки

Контент вызова 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)) 
          ^
          ^

Как я уже говорил, это произошло после того, как строить код на другой системе. Я думал, что это как-то связано с изменением версий компилятора, но опять же, я думаю, что что-то простое, как функция сортировки, не сломается. Плюс я бы хотел, чтобы код компилировался на обоих компиляторах, если это так.

Действительно был бы признателен за помощь,

+0

* «Я думаю, что что-то же просто, как функция сортировки не будет нарушать» * - Если вы не» t следуют предварительным условиям алгоритма, он имеет полное право разбиться. В частности, обратите внимание на требование [прототипа компаратора] (http://en.cppreference.com/w/cpp/algorithm/sort) – StoryTeller

+0

Я бы не стал уделять слишком много внимания тому факту, что он работал над другим компилятором , Его не редкость для компиляторов принимать вещи, которые они технически не должны, а другие компиляторы или более поздние версии одного и того же компилятора могут быть более строгими. Кроме того, вы должны вернуть вектор самих векторов, а не указатель на него, который был выделен вручную. – RyanP

+0

@ RyanP Спасибо за подсказку, сохранит это в виду в будущем. –

ответ

4

Ваш код пытается взять не-const ссылается на объект const, который не разрешен. Функция сравнения оленья кожа изменить свои аргументы так изменения:

bool AssemblyObject::compare(AssemblyObject &a, AssemblyObject &b){

К

bool AssemblyObject::compare(const AssemblyObject &a, const AssemblyObject &b){

+0

Собственно, это первое, что я пробовал. Он по-прежнему дает ту же ошибку компилятора (которая является несколько плотной, если вы спросите меня). Это также не полностью объясняет тот факт, что этот точный код использовался для компиляции в другой системе. EDIT: Извините, я забыл также отредактировать заголовок. Теперь я так глуп. Благодаря! –

3

ошибка довольно ясна - вам нужно compare принять constLvalue ссылки, не изменяемые из них:

bool AssemblyObject::compare(const AssemblyObject &a, const AssemblyObject &b) 
{ 
    /* as before */ 
} 
+0

На самом деле, это первое, что я пробовал. Он по-прежнему дает ту же ошибку компилятора (которая является несколько плотной, если вы спросите меня). Это также не полностью объясняет тот факт, что этот точный код использовался для компиляции в другой системе. EDIT: Извините, я забыл также отредактировать заголовок. Теперь я так глуп. Благодаря! –

+0

@StoryTeller: ничего себе ... Я действительно забыл. –

 Смежные вопросы

  • Нет связанных вопросов^_^