Bonjour à tous, j'ai un problème avec l'utilisation des smart pointer, des ranges de boost et de bind:
Soit le code suivant qui a pour but d'afficher les éléments d'une collection (de pointeurs de A) pour lesquels une fonction membre renvoie vrai:
Ce code compile parfaitement mais si maintenant je remplace la ligne (1) par:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 struct A { bool ok() const { return true; } }; #include <vector> #include <boost/shared_ptr.hpp> #include <boost/lambda/bind.hpp> #include <boost/lambda/lambda.hpp> #include <boost/range/adaptor/filtered.hpp> #include <boost/foreach.hpp> #define foreach BOOST_FOREACH int main() { using namespace boost; using namespace boost::lambda; using namespace boost::adaptors; //on définit un type pointeur sur A typedef A* PtrA; //(1) //une collection de pointeurs de A std::vector<PtrA> listA; //on affiche uniquement les A pour lesquel ok est vrai foreach(PtrA& a, listA | filtered(bind(&A::ok, _1))) //(2) std::cout << "ok" << std::endl; }
, le compilateur me sort:
Code : Sélectionner tout - Visualiser dans une fenêtre à part typedef shared_ptr<A> PtrA;
Par contre si je remplace la ligne (2) par:error C2665: 'boost::lambda::function_adaptor<Func>::apply'*: aucune des 2 surcharges n'a pu convertir tous les types d'arguments
le code compile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part foreach(PtrA& a, listA | filtered(bind(&A::ok, bind(&PtrA::get, _1))))
Je pensais que les smart pointer s'utilisaient comme des pointeurs, je ne comprend pas pourquoi je doit repasser par le pointeur "brut" (en appelant PtrA::get) pour pouvoir utiliser la fonction membre ok de A?
Partager