2017-02-02 10 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)) 
          ^
          ^

私が言ったように、これは別のシステム上でコードをビルドした後に起こりました。私はそれがコンパイラのバージョンを変更することと関係があると思っていましたが、もう一度、ソート関数のような単純なものが壊れないと思います。私は両方のコンパイラでコンパイルすることをお勧めします。

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

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

を* *「私はソート関数のような単純な何かが壊れていないと思う」:変更してその引数を変更する機能doesntの比較アルゴリズムの前提条件に従えば、それは壊れるあらゆる権利を持っています。特に、[コンパレータのプロトタイプ](http://en.cppreference.com/w/cpp/algorithm/sort)の要件に注意してください。 – StoryTeller

+0

別のコンパイラで動作することにはあまり集中しません。コンパイラが技術的に拒否すべきでないものを受け入れることは珍しくなく、同じコンパイラの他のコンパイラまたはそれ以降のリリースはもっと厳しいかもしれません。また、ベクトル自体のベクトルを返します。手動で割り当てられたベクトルへのポインタではありません。 – RyanP

+0

@RyanPヒントをお寄せいただきありがとうございます。 –

答えて

4

あなたのコードを取るしようとしている:あなたは変更可能なもの、const左辺値参照を受け入れるようにcompareを必要はありません -

は本当に誤差はかなり明確であるいくつかの助け、

+0

実際、それが私が最初に試したことです。それは同じコンパイラエラー(あなたが私に尋ねるとやや怪しいです)を与えます。また、この正確なコードが別のシステムでコンパイルに使用されたという事実を完全には説明しません。編集:申し訳ありませんが、私もヘッダーを編集するのを忘れていた。私は今、とても愚かな気がする。ありがとう! –

3

をいただければ幸いですconstオブジェクトに対する非const参照。これは許可されていません。 - 「あなたはドン場合

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

+0

実際、それが私が最初に試したことです。それは同じコンパイラエラー(あなたが私に尋ねるとやや怪しいです)を与えます。また、この正確なコードが別のシステムでコンパイルに使用されたという事実を完全には説明しません。編集:申し訳ありませんが、私もヘッダーを編集するのを忘れていた。私は今、とても愚かな気がする。ありがとう! –

+0

@StoryTeller:うわー...私は本当に忘れました。 –

関連する問題