Problème avec les pointeurs intelligents de boost.
Bonjour à tous,
J'ai un petit souci quant à l'utilisation des smart pointers. Mais je vous montre sans plus attendre le problème :
Voici le .cpp de la méthode qui pose problème : (désolé pour l'indentation très large)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| ListePalierPtr AtelierPerfo::ConstruitListePaliers()
{
int Compteur=0;
PalierPtr palier;
//ListeTrieePalierPtr<double, PalierPtr> liste;
ListeTrieePalierPtr liste;
liste.reset( new ListeTrieePalier());
// Premier palier
palier.reset( new Palier((AtelierPerfoPtr)this));
palier->PremierPalier();
while (palier.get() != NULL)
{
// Détermination de la borne supérieure
CalculPijReel();
palier->borneSup = ordo->NEH(); // on avait palier->borneSup = ordo->NEH();
std::cout << "BIP " << Compteur << std::endl;
std::cout << "Borne inférieure du palier : " << palier->borneInf << std::endl;
liste->Ajouter(palier->GetborneInf(),palier);
std::cout << "BIP - second " << Compteur << std::endl;
// Autres paliers
palier.reset( palier->PalierSuivant().get());
Compteur++;
}
std::cout << "BIP ConstruitListePaliers finie !" << std::endl;
return((ListePalierPtr)liste);
} |
Les types MachinPtr sont définis de cette manière :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #ifndef Definitions_H
#define Definitions_H
#include <boost/shared_ptr.hpp>
#include <boost/array.hpp>
#include <boost/shared_array.hpp>
#include <boost/multi_array.hpp>
//#include "../Flowshop/Atelier.h"
//#include "../Flowshop/Ordo.h"
//#include "../Flowshop/BandB/BandB.h"
// (Re)définition des différentes classes utilisées dans le projet.
class Atelier;
class Ordo;
class AtelierPerfo;
class Palier;
class Noeud;
class ListeNoeuds;
class BandB;
class PalierPremierDernierJob;
template<typename INDICE, typename TYPE> class ListeTriee;
template<typename TYPE> class Liste;
// Définition des pointeurs intelligents tels qu'ils sont utilisés.
// (À ce titre voir l'article http://arb.developpez.com/c++/raii/shared_ptr/ ,
// on y apprend que les pointeurs intelligents font office de ramasse-miettes.
typedef boost::shared_ptr<int> intPtr;
typedef boost::shared_ptr<Atelier> AtelierPtr;
typedef boost::shared_ptr<Ordo> OrdoPtr;
typedef boost::shared_ptr<AtelierPerfo> AtelierPerfoPtr;
typedef boost::shared_ptr<Palier> PalierPtr;
typedef boost::shared_ptr<Noeud> NoeudPtr;
typedef boost::shared_ptr<ListeNoeuds> ListeNoeudsPtr;
typedef boost::shared_ptr<BandB> BandBPtr;
typedef boost::shared_ptr<PalierPremierDernierJob> PalierPremierDernierJobPtr;
// déclaration des listes triées de paliers indexées par des réels _double_
typedef ListeTriee<double, PalierPtr> ListeTrieePalier;
typedef Liste<Palier> ListePalier;
typedef boost::shared_ptr<ListeTrieePalier> ListeTrieePalierPtr;
typedef boost::shared_ptr<ListePalier> ListePalierPtr;
// Vecteurs
typedef boost::shared_array<Atelier> AtelierArray;
typedef boost::shared_array<int> intArray;
typedef boost::shared_array<double> doubleArray;
typedef boost::shared_array<Palier> PalierArray;
//typedef boost::shared_array<Noeud> NoeudArray;
// Tableaux
//typedef boost::multi_array<double, 2> doubleTableau;
typedef boost::shared_array< boost::shared_array<double> > doubleTableau;
#endif |
Et alors, le message d'erreur à la compilation :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| cd '/home/adrien/Documents/Travail/recherche/StageFlowShop/C++' && QTDIR="/usr/share/qt3" make -j1
g++ -c -pipe -Wall -W -g -D_REENTRANT -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT -I/usr/share/qt3/mkspecs/default -I. -I/usr/include/qt3 -o AtelierPerfo.o FlowshopPerfo/AtelierPerfo.cpp
/usr/include/boost/shared_ptr.hpp: In constructor «boost::shared_ptr<T>::shared_ptr(const boost::shared_ptr<Y>&) [with Y = Palier, T = boost::shared_ptr<Palier>]":
FlowshopPerfo/AtelierPerfo.cpp:329: instantiated from here
/usr/include/boost/shared_ptr.hpp:162: erreur: cannot convert «Palier* const" to «boost::shared_ptr<Palier>*" in initialization
FlowshopPerfo/../ClassesAnnexes/ListeTriee.tpp: In member function «void ListeTriee<INDICE, TYPE>::Ajouter(INDICE, boost::shared_ptr<U>) [with INDICE = double, TYPE = boost::shared_ptr<Palier>]":
FlowshopPerfo/AtelierPerfo.cpp:329: instantiated from here
FlowshopPerfo/../ClassesAnnexes/ListeTriee.tpp:15: erreur: «class boost::shared_array<boost::shared_ptr<boost::shared_ptr<Palier> > >" has no member named «push_back"
FlowshopPerfo/../ClassesAnnexes/ListeTriee.tpp:16: erreur: «class boost::shared_array<double>" has no member named «push_back"
/usr/include/boost/shared_ptr.hpp: In constructor «boost::shared_ptr<T>::shared_ptr(const boost::shared_ptr<Y>&) [with Y = ListeTriee<double, boost::shared_ptr<Palier> >, T = Liste<Palier>]":
FlowshopPerfo/AtelierPerfo.cpp:338: instantiated from here
/usr/include/boost/shared_ptr.hpp:162: erreur: cannot convert «ListeTriee<double, boost::shared_ptr<Palier> >* const" to «Liste<Palier>*" in initialization
FlowshopPerfo/../ClassesAnnexes/ListeTriee.tpp: In destructor «ListeTriee<INDICE, TYPE>::~ListeTriee() [with INDICE = double, TYPE = boost::shared_ptr<Palier>]":
/usr/include/boost/checked_delete.hpp:34: instantiated from «void boost::checked_delete(T*) [with T = ListeTrieePalier]"
/usr/include/boost/detail/shared_count.hpp:86: instantiated from «boost::detail::shared_count::shared_count(Y*) [with Y = ListeTrieePalier]"
/usr/include/boost/shared_ptr.hpp:124: instantiated from «boost::shared_ptr<T>::shared_ptr(Y*) [with Y = ListeTrieePalier, T = ListeTriee<double, boost::shared_ptr<Palier> >]"
/usr/include/boost/shared_ptr.hpp:237: instantiated from «void boost::shared_ptr<T>::reset(Y*) [with Y = ListeTrieePalier, T = ListeTriee<double, boost::shared_ptr<Palier> >]"
FlowshopPerfo/AtelierPerfo.cpp:315: instantiated from here
FlowshopPerfo/../ClassesAnnexes/ListeTriee.tpp:83: erreur: type «class boost::shared_ptr<boost::shared_ptr<Palier> >" argument given to «delete", expected pointer
FlowshopPerfo/../ClassesAnnexes/ListeTriee.tpp:85: erreur: type «class boost::shared_array<boost::shared_ptr<boost::shared_ptr<Palier> > >" argument given to «delete", expected pointer
FlowshopPerfo/../ClassesAnnexes/ListeTriee.tpp:86: erreur: type «class boost::shared_array<double>" argument given to «delete", expected pointer
make: *** [AtelierPerfo.o] Erreur 1
*** Exited with status: 2 *** |
(Pour les erreurs qui suivent, ce n'est pas lié a priori, je les déboguerai après, ce n'est pas un problème)
J'ai mis en rouge la ligne de la méthode qui pose problème.
Ce qui me chagrine, c'est que l'appel à la méthode liste->Ajouter(...) me semble bien respecter la déclaration de la méthode :
template <typename INDICE, typename TYPE>
void ListeTriee<INDICE,TYPE>::Ajouter(INDICE Indice, boost::shared_ptr<TYPE> Element)
Voilà, si vous avez quelques idées à ce propos...
Merci,
Le Barde.