次のコードでカスタム型のベクトルを並べ替えることができます。それは以前から使用されていましたが、別のシステムにコードをビルドした後、コンパイル時にエラーが発生します。並べ替えを使用するときに型の初期化が無効
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))
^
^
私が言ったように、これは別のシステム上でコードをビルドした後に起こりました。私はそれがコンパイラのバージョンを変更することと関係があると思っていましたが、もう一度、ソート関数のような単純なものが壊れないと思います。私は両方のコンパイラでコンパイルすることをお勧めします。
bool AssemblyObject::compare(const AssemblyObject &a, const AssemblyObject &b)
{
/* as before */
}
へ
bool AssemblyObject::compare(AssemblyObject &a, AssemblyObject &b){
を* *「私はソート関数のような単純な何かが壊れていないと思う」:変更してその引数を変更する機能doesntの比較アルゴリズムの前提条件に従えば、それは壊れるあらゆる権利を持っています。特に、[コンパレータのプロトタイプ](http://en.cppreference.com/w/cpp/algorithm/sort)の要件に注意してください。 – StoryTeller
別のコンパイラで動作することにはあまり集中しません。コンパイラが技術的に拒否すべきでないものを受け入れることは珍しくなく、同じコンパイラの他のコンパイラまたはそれ以降のリリースはもっと厳しいかもしれません。また、ベクトル自体のベクトルを返します。手動で割り当てられたベクトルへのポインタではありません。 – RyanP
@RyanPヒントをお寄せいただきありがとうございます。 –