【发布时间】:2017-06-19 16:26:32
【问题描述】:
我有以下代码来对自定义类型的向量进行排序。它曾经可以工作,但是在另一个系统上构建代码后,它会在编译时出错。
进行 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))
^
^
正如我所说,这发生在在另一个系统上构建代码之后。我认为这与更改编译器版本有关,但话又说回来,我认为像排序函数这样简单的东西不会破坏。另外,如果是这种情况,我希望代码可以在两个编译器上编译。
真的很感谢一些帮助,
【问题讨论】:
-
“我认为像排序函数这样简单的东西不会破坏” - 如果您不遵循算法的先决条件,它完全有权破坏。特别要注意prototype of the comparator 中的要求
-
我不会过多关注它在另一个编译器上工作的事实。编译器接受他们在技术上不应该接受的东西并不少见,其他编译器或同一编译器的更高版本可能更严格。此外,您应该返回向量本身的向量,而不是手动分配的指向它的指针。
-
@RyanP 感谢您的提示,以后会记住这一点。
标签: c++ sorting initialization std