Forum Programmation.c++ std::sort et operator d'affectation

Posté par  .
Étiquettes : aucune
0
30
août
2006
Bonjour forum,

J'ai un petit problème de compilation.
Si quelqu'un pouvait m'aider.

J'ai une classe A ou je définis les operateurs =, <, >, <=, >=, ==
Dans une autre classe B, je définis un vecteur de A,


std::vector vect;


Le problème se trouve quand j'utilise la fonction de tri de :

std::sort(vect.begin(), vect.end());


J'obtiens alors le message d'erreur suivant :

------ Build started: Project: MainEngine, Configuration: Debug Win32 ------
Compiling...
main.cpp
/include/algorithm(2623) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const A' (or there is no acceptable conversion)
A.h(14): could be 'A &A::operator =(A)'
while trying to match the argument list '(const A, A)'
/include/algorithm(2639) : see reference to function template instantiation 'void std::_Insertion_sort1<_BidIt,A>(_BidIt,_BidIt,_Ty *)' being compiled
with
[
_BidIt=std::_Vector_const_iterator<A,std::allocator>,
_Ty=A
]
/include/algorithm(2747) : see reference to function template instantiation 'void std::_Insertion_sort<_RanIt>(_BidIt,_BidIt)' being compiled
with
[
_RanIt=std::_Vector_const_iterator<A,std::allocator>,
_BidIt=std::_Vector_const_iterator<A,std::allocator>
]
/include/algorithm(2754) : see reference to function template instantiation 'void std::_Sort<std::_Vector_const_iterator<_Ty,_Alloc>,__w64 int>(_RanIt,_RanIt,_Diff)' being compiled
with
[
_Ty=A,
_Alloc=std::allocator,
_RanIt=std::_Vector_const_iterator<A,std::allocator>,
_Diff=__w64 int
]
main.cpp(24) : see reference to function template instantiation 'void std::sort<std::_Vector_const_iterator<_Ty,_Alloc>>(_RanIt,_RanIt)' being compiled
with
[
_Ty=A,
_Alloc=std::allocator,
_RanIt=std::_Vector_const_iterator<A,std::allocator>
]
/include/algorithm(2630) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const A' (or there is no acceptable conversion)
A.h(14): could be 'A &A::operator =(A)'
while trying to match the argument list '(const A, const A)'
/include/algorithm(2631) : error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const A' (or there is no acceptable conversion)
A.h(14): could be 'A &A::operator =(A)'
while trying to match the argument list '(const A, A)'
Build log was saved at "file://BuildLog.htm"
MainEngine - 3 error(s), 0 warning(s)
======== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


J'ai bien défini l'operator=

A& operator = (const A& a);


Je comprends pas pourquoi le compilo attend 2 arguments (const A& lhs, A rhs) ???


Merci de votre aide.
  • # StlPort est ton amis

    Posté par  . Évalué à 2.

    Tu compile sous visual studio? si c'est VC6, pas étonnant, la stl était bugué... essaie de télécharger stlPort ici :

    http://www.stlport.org/

    stlPort est une implémentation multiplatteforme de la bibliothèque standard du c++, qui remplace allègrement les versions bugués de microsoft.

    Ensuite dans les répertoire d'include prédéfinis de visual tu devras mettre les répertoires include de stlPort plus prioritaire par rapport à ceux de visual.
    Ensuite recompile, et revient pour dire si ça marche mieux...
    • [^] # Re: StlPort est ton amis

      Posté par  . Évalué à 2.

      j'ai compilé sous Visual .net 2005, elle est aussi buguée la stl ?
      • [^] # Re: StlPort est ton amis

        Posté par  . Évalué à 2.

        As tu définit un namespace pour tes classe?
        Genre ta classe B se trouverait pas dans un espace de nommage?
        si tu utilise dans ton .cpp qui implémente ta classe B une déclaration comme "using namespace BSpace;", alors ton problème vient de là...
        Si c'est ça, à la place je pense que tu devrais encapsuler l'implémentation de ta classe dans un "namespace BSpace { .... }".
        Ce qui devrais te permettre de compiler sans souçi.


        Sinon, si c'est pas ça ou un truc lié aux namespaces, utilise stlPort...
        • [^] # Re: StlPort est ton amis

          Posté par  . Évalué à 1.

          Bon j'ai trouvé ce que c'était. J'ai un peu honte :)
          Dans la fonction qui exécutait :

          std::sort(vect.begin(), vect.end());

          j'avais mis vect const :-/
          Comme quoi à trop vouloir mettre des const partout...

          Merci à toi Bench pour ton aide.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.