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:
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;
}
Ce code compile parfaitement mais si maintenant je remplace la ligne (1) par:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
typedef shared_ptr<A> PtrA;
, le compilateur me sort:
error C2665: 'boost::lambda::function_adaptor<Func>::apply'*: aucune des 2 surcharges n'a pu convertir tous les types d'arguments
Par contre si je remplace la ligne (2) par:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
foreach(PtrA& a, listA | filtered(bind(&A::ok, bind(&PtrA::get, _1))))
le code compile.
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?