2017-02-02 1 views
0

J'ai le code suivant pour trier un vecteur d'un type personnalisé. Il a l'habitude de fonctionner, mais après avoir construit le code sur un autre système, il donne une erreur au moment de la compilation.Initialisation non valide du type lors de l'utilisation du tri

Le contexte dans lequel l'appel sort() est effectué.

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); 

    ... 
} 

La fonction de tri

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])); 
} 

L'erreur

/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)) 
          ^
          ^

Comme je l'ai dit, cela est arrivé après avoir construit le code sur un autre système. Je pensais que cela avait quelque chose à voir avec la modification des versions du compilateur, mais là encore, je pense que quelque chose d'aussi simple qu'une fonction de tri ne casserait pas. De plus, j'aimerais que le code compile sur les deux compilateurs si c'était le cas.

serait vraiment apprécier un peu d'aide,

+0

* « Je pense que quelque chose d'aussi simple que d'une fonction de tri ne serait pas casser » * - Si vous n » t suivre les pré-conditions de l'algorithme, il a parfaitement le droit de rompre. En particulier, notez l'exigence du [prototype du comparateur] (http://fr.cppreference.com/w/cpp/algorithm/sort) – StoryTeller

+0

Je ne me concentrerais pas trop sur le fait qu'il a travaillé sur un autre compilateur . Il n'est pas rare que les compilateurs acceptent des choses qu'ils ne devraient techniquement pas faire, et d'autres compilateurs ou versions ultérieures du même compilateur pourraient être plus stricts. En outre, vous devez renvoyer le vecteur des vecteurs lui-même, pas un pointeur qui a été alloué manuellement. – RyanP

+0

@RyanP Merci pour le conseil, gardez cela à l'esprit dans le futur. –

Répondre

4

Votre code tente de prendre référence non-const à un objet const, ce qui n'est pas autorisé. La fonction de comparaison ne marche pas modifier ses arguments si le changement:

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

Pour

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

+0

En fait, c'est la première chose que j'ai essayé. Il donne toujours la même erreur de compilateur (ce qui est un peu bizarre si vous me demandez). Cela n'expliquerait pas complètement le fait que ce code exact soit utilisé pour compiler sur un autre système. EDIT: Désolé, j'ai oublié d'éditer l'en-tête aussi. Je me sens tellement stupide maintenant. Merci! –

3

L'erreur est assez clair - vous avez besoin compare d'accepter constlvalue références, les non mutables:

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

En fait, c'est la première chose que j'ai essayé. Il donne toujours la même erreur de compilateur (ce qui est un peu bizarre si vous me demandez). Cela n'expliquerait pas complètement le fait que ce code exact soit utilisé pour compiler sur un autre système. EDIT: Désolé, j'ai oublié d'éditer l'en-tête aussi. Je me sens tellement stupide maintenant. Merci! –

+0

@StoryTeller: wow ... J'ai en effet oublié. –