Boost lambda et objet complexe

Boost lambda et objet complexe - C++ - Programmation

Marsh Posté le 26-03-2010 à 19:10:39    

Bonjour,
 
J'ai un problème assez récurent avec boost::lambda: je n'arrive pas à l'utiliser avec des objets complexes.  
 
Par exemple je veux compter combien il y a d'éléments dans un tableau 2D. Je voudrais pouvoir faire cela:

Code :
  1. typedef std::vector<double> TArray;
  2. std::vector<TArray> array;
  3. ...
  4. size_t nb_elem = 0;
  5. std::for_each(array.begin(), array.end(), var(nb_elem) += _1.size());


Et donc, ici il râle car size n'est pas un élément de lambda_functor<T>.
 
Dans la doc, j'ai crus comprendre qu'il fallait faire quelque chose comme cela:

Code :
  1. typedef std::vector<double> TArray;
  2. std::vector<TArray> array;
  3. ...
  4. size_t nb_elem = 0;
  5. std::for_each(array.begin(), array.end(), var(nb_elem) += _1 ->. &TArray::size);


Mais bon, le compilo dit que ce n'est pas ça...
 
Est ce que quelqu'un pourrai m'expliquer comment on l'utilise dans ce genre de cas ?
 
Merci

Reply

Marsh Posté le 26-03-2010 à 19:10:39   

Reply

Marsh Posté le 26-03-2010 à 21:41:29    

Un truc dans le genre je dirais (non testé) :
 

Code :
  1. #include <boost/lambda/bind.hpp>
  2. ...
  3. std::for_each(array.begin(), array.end(), var(nb_elem) += bind(&TArray::size, _1));


 

Reply

Marsh Posté le 26-03-2010 à 21:46:16    

faut passer par bind effectivement.
Regarde du coter d ephoenix pour plus d'expressivité

Reply

Marsh Posté le 26-03-2010 à 21:59:31    

Ah effectivement, c'est comme cela que cela fonctionne...
 
Merci de votre aide  :jap:  
 
# Et je vais aller voir Phoenix!

Reply

Marsh Posté le 30-03-2010 à 17:12:27    

Bon, j'ai un nouveau souci...  
 
Cela compile:

Code :
  1. #include <algorithm>
  2. #include <vector>
  3. #include <boost/lambda/lambda.hpp>
  4. #include <boost/lambda/bind.hpp>
  5. int main() {
  6.      using namespace boost::lambda;
  7.      size_t nb_elem = 10;
  8.      std::vector< std::vector< double > > matrix;
  9.      matrix.resize(nb_elem);
  10.      std::for_each(matrix.begin(), matrix.end(), bind(&std::vector<double>::push_back, _1, nb_elem));
  11.      return 0;
  12. }


 
Mais pas cela:

Code :
  1. #include <algorithm>
  2. #include <vector>
  3. #include <boost/lambda/lambda.hpp>
  4. #include <boost/lambda/bind.hpp>
  5. int main() {
  6.      using namespace boost::lambda;
  7.      size_t nb_elem = 10;
  8.      std::vector< std::vector< double > > matrix;
  9.      matrix.resize(nb_elem);
  10.      std::for_each(matrix.begin(), matrix.end(), bind(&std::vector<double>::resize, _1, nb_elem));
  11.      return 0;
  12. }


 
# donc exactement pareil, mais avec un "resize" a la place du "push_back"...
 
Le compilo, me retourne cela:

Citation :

1>------ Début de la génération : Projet : SimpleProject, Configuration : Debug Win32 ------
1>Compilation en cours...
1>main.cpp
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<10,boost::lambda::function_action<10,T>>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4,const Arg5,const Arg6,const Arg7,const Arg8,const Arg9,const Arg10>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 &,const Arg7 &,const Arg8 &,const Arg9 &,const Arg10 & )' : 10 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(1743) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<Arity,Act>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4,const Arg5,const Arg6,const Arg7,const Arg8,const Arg9,const Arg10>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 &,const Arg7 &,const Arg8 &,const Arg9 &,const Arg10 & )' : 10 arguments attendus - 3 fournis
1>        with
1>        [
1>            Arity=10,
1>            Act=boost::lambda::function_action<10>
1>        ]
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(1710) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<10,boost::lambda::function_action<10,T>>,detail::bind_tuple_mapper<Result(__cdecl & )(Par1,Par2,Par3,Par4,Par5,Par6,Par7,Par8,Par9),const Arg2,const Arg3,const Arg4,const Arg5,const Arg6,const Arg7,const Arg8,const Arg9,const Arg10>::type>> boost::lambda::bind(Result (__cdecl & )(Par1,Par2,Par3,Par4,Par5,Par6,Par7,Par8,Par9),const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 &,const Arg7 &,const Arg8 &,const Arg9 &,const Arg10 & )' : 10 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(1673) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<9,boost::lambda::function_action<9,T>>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4,const Arg5,const Arg6,const Arg7,const Arg8,const Arg9>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 &,const Arg7 &,const Arg8 &,const Arg9 & )' : 9 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(1526) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<Arity,Act>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4,const Arg5,const Arg6,const Arg7,const Arg8,const Arg9>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 &,const Arg7 &,const Arg8 &,const Arg9 & )' : 9 arguments attendus - 3 fournis
1>        with
1>        [
1>            Arity=9,
1>            Act=boost::lambda::function_action<9>
1>        ]
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(1494) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<9,boost::lambda::function_action<9,T>>,detail::bind_tuple_mapper<Result(__cdecl & )(Par1,Par2,Par3,Par4,Par5,Par6,Par7,Par8),const Arg2,const Arg3,const Arg4,const Arg5,const Arg6,const Arg7,const Arg8,const Arg9>::type>> boost::lambda::bind(Result (__cdecl & )(Par1,Par2,Par3,Par4,Par5,Par6,Par7,Par8),const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 &,const Arg7 &,const Arg8 &,const Arg9 & )' : 9 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(1458) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<8,boost::lambda::function_action<8,T>>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4,const Arg5,const Arg6,const Arg7,const Arg8>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 &,const Arg7 &,const Arg8 & )' : 8 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(1322) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<Arity,Act>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4,const Arg5,const Arg6,const Arg7,const Arg8>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 &,const Arg7 &,const Arg8 & )' : 8 arguments attendus - 3 fournis
1>        with
1>        [
1>            Arity=8,
1>            Act=boost::lambda::function_action<8>
1>        ]
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(1291) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<8,boost::lambda::function_action<8,T>>,detail::bind_tuple_mapper<Result(__cdecl & )(Par1,Par2,Par3,Par4,Par5,Par6,Par7),const Arg2,const Arg3,const Arg4,const Arg5,const Arg6,const Arg7,const Arg8>::type>> boost::lambda::bind(Result (__cdecl & )(Par1,Par2,Par3,Par4,Par5,Par6,Par7),const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 &,const Arg7 &,const Arg8 & )' : 8 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(1257) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<7,boost::lambda::function_action<7,T>>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4,const Arg5,const Arg6,const Arg7>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 &,const Arg7 & )' : 7 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(1123) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<Arity,Act>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4,const Arg5,const Arg6,const Arg7>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 &,const Arg7 & )' : 7 arguments attendus - 3 fournis
1>        with
1>        [
1>            Arity=7,
1>            Act=boost::lambda::function_action<7>
1>        ]
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(1092) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<7,boost::lambda::function_action<7,T>>,detail::bind_tuple_mapper<Result(__cdecl & )(Par1,Par2,Par3,Par4,Par5,Par6),const Arg2,const Arg3,const Arg4,const Arg5,const Arg6,const Arg7>::type>> boost::lambda::bind(Result (__cdecl & )(Par1,Par2,Par3,Par4,Par5,Par6),const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 &,const Arg7 & )' : 7 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(1058) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<6,boost::lambda::function_action<6,T>>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4,const Arg5,const Arg6>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 & )' : 6 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(927) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<Arity,Act>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4,const Arg5,const Arg6>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 & )' : 6 arguments attendus - 3 fournis
1>        with
1>        [
1>            Arity=6,
1>            Act=boost::lambda::function_action<6>
1>        ]
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(899) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<6,boost::lambda::function_action<6,T>>,detail::bind_tuple_mapper<Result(__cdecl & )(Par1,Par2,Par3,Par4,Par5),const Arg2,const Arg3,const Arg4,const Arg5,const Arg6>::type>> boost::lambda::bind(Result (__cdecl & )(Par1,Par2,Par3,Par4,Par5),const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 &,const Arg6 & )' : 6 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(867) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<5,boost::lambda::function_action<5,T>>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4,const Arg5>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 & )' : 5 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(738) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<Arity,Act>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4,const Arg5>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 & )' : 5 arguments attendus - 3 fournis
1>        with
1>        [
1>            Arity=5,
1>            Act=boost::lambda::function_action<5>
1>        ]
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(710) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<5,boost::lambda::function_action<5,T>>,detail::bind_tuple_mapper<Result(__cdecl & )(Par1,Par2,Par3,Par4),const Arg2,const Arg3,const Arg4,const Arg5>::type>> boost::lambda::bind(Result (__cdecl & )(Par1,Par2,Par3,Par4),const Arg2 &,const Arg3 &,const Arg4 &,const Arg5 & )' : 5 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(679) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<4,boost::lambda::function_action<4,T>>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 & )' : 4 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(558) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<Arity,Act>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3,const Arg4>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 &,const Arg4 & )' : 4 arguments attendus - 3 fournis
1>        with
1>        [
1>            Arity=4,
1>            Act=boost::lambda::function_action<4>
1>        ]
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(532) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<4,boost::lambda::function_action<4,T>>,detail::bind_tuple_mapper<Result(__cdecl & )(Par1,Par2,Par3),const Arg2,const Arg3,const Arg4>::type>> boost::lambda::bind(Result (__cdecl & )(Par1,Par2,Par3),const Arg2 &,const Arg3 &,const Arg4 & )' : 4 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(503) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2784: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,boost::lambda::function_action<3,T>>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 & )' : impossible de déduire l'argument modèle pour 'type de fonction surchargée' à partir de 'type de fonction surchargée'
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(387) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2784: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,boost::lambda::function_action<3,T>>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 & )' : impossible de déduire l'argument modèle pour 'type de fonction surchargée' à partir de 'type de fonction surchargée'
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(387) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2784: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,boost::lambda::function_action<3,T>>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 & )' : impossible de déduire l'argument modèle pour 'type de fonction surchargée' à partir de 'type de fonction surchargée'
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(387) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2784: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<Arity,Act>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 & )' : impossible de déduire l'argument modèle pour 'type de fonction surchargée' à partir de 'type de fonction surchargée'
1>        with
1>        [
1>            Arity=3,
1>            Act=boost::lambda::function_action<3>
1>        ]
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(361) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2784: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<Arity,Act>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 & )' : impossible de déduire l'argument modèle pour 'type de fonction surchargée' à partir de 'type de fonction surchargée'
1>        with
1>        [
1>            Arity=3,
1>            Act=boost::lambda::function_action<3>
1>        ]
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(361) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2784: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<Arity,Act>,detail::bind_tuple_mapper<const Arg1,const Arg2,const Arg3>::type>> boost::lambda::bind(const Arg1 &,const Arg2 &,const Arg3 & )' : impossible de déduire l'argument modèle pour 'type de fonction surchargée' à partir de 'type de fonction surchargée'
1>        with
1>        [
1>            Arity=3,
1>            Act=boost::lambda::function_action<3>
1>        ]
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(361) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2784: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,boost::lambda::function_action<3,T>>,detail::bind_tuple_mapper<Result(__cdecl & )(Par1,Par2),const Arg2,const Arg3>::type>> boost::lambda::bind(Result (__cdecl & )(Par1,Par2),const Arg2 &,const Arg3 & )' : impossible de déduire l'argument modèle pour 'type de fonction surchargée' à partir de 'type de fonction surchargée'
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(333) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2784: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,boost::lambda::function_action<3,T>>,detail::bind_tuple_mapper<Result(__cdecl & )(Par1,Par2),const Arg2,const Arg3>::type>> boost::lambda::bind(Result (__cdecl & )(Par1,Par2),const Arg2 &,const Arg3 & )' : impossible de déduire l'argument modèle pour 'type de fonction surchargée' à partir de 'type de fonction surchargée'
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(333) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2784: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3,boost::lambda::function_action<3,T>>,detail::bind_tuple_mapper<Result(__cdecl & )(Par1,Par2),const Arg2,const Arg3>::type>> boost::lambda::bind(Result (__cdecl & )(Par1,Par2),const Arg2 &,const Arg3 & )' : impossible de déduire l'argument modèle pour 'type de fonction surchargée' à partir de 'type de fonction surchargée'
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(333) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2,boost::lambda::function_action<2,T>>,detail::bind_tuple_mapper<const Arg1,const Arg2>::type>> boost::lambda::bind(const Arg1 &,const Arg2 & )' : 2 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(232) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<Arity,Act>,detail::bind_tuple_mapper<const Arg1,const Arg2>::type>> boost::lambda::bind(const Arg1 &,const Arg2 & )' : 2 arguments attendus - 3 fournis
1>        with
1>        [
1>            Arity=2,
1>            Act=boost::lambda::function_action<2>
1>        ]
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(212) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2,boost::lambda::function_action<2,T>>,detail::bind_tuple_mapper<Result(__cdecl & )(Par1),const Arg2>::type>> boost::lambda::bind(Result (__cdecl & )(Par1),const Arg2 & )' : 2 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(190) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<1,boost::lambda::function_action<1,T>>,detail::bind_tuple_mapper<const Arg1>::type>> boost::lambda::bind(const Arg1 & )' : 1 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(91) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<Arity,Act>,detail::bind_tuple_mapper<const Arg1>::type>> boost::lambda::bind(const Arg1 & )' : 1 arguments attendus - 3 fournis
1>        with
1>        [
1>            Arity=1,
1>            Act=boost::lambda::function_action<1>
1>        ]
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(71) : voir la déclaration de 'boost::lambda::bind'
1>c:\documents and settings\user\mes documents\visual studio 2005\projects\simpleproject\simpleproject\main.cpp(14) : error C2780: 'const boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<1,boost::lambda::function_action<1,T>>,detail::bind_tuple_mapper<Result(__cdecl & )(void)>::type>> boost::lambda::bind(Result (__cdecl & )(void))' : 1 arguments attendus - 3 fournis
1>        \boost_1_42_0\boost\lambda\detail\bind_functions.hpp(49) : voir la déclaration de 'boost::lambda::bind'


 
 
Avez-vous d'où se trouve le pb?


Message édité par Amonchakai le 30-03-2010 à 17:25:06
Reply

Marsh Posté le 30-03-2010 à 17:18:37    

Ah autant pour moi... je crois que c'est l'argument par defaut sur la valeur par defaut des variables...
 
[edit] Je l'ai corrigé, mais a priori ce n'est pas cela...

Code :
  1. #include <algorithm>
  2. #include <vector>
  3. #include <boost/lambda/lambda.hpp>
  4. #include <boost/lambda/bind.hpp>
  5. int main() {
  6.      using namespace boost::lambda;
  7.      size_t nb_elem = 10;
  8.      std::vector< std::vector< double > > matrix;
  9.      matrix.resize(nb_elem);
  10.      std::for_each(matrix.begin(), matrix.end(), bind(&std::vector<double>::resize, _1, nb_elem, 0.));
  11.      return 0;
  12. }


Message édité par Amonchakai le 30-03-2010 à 17:27:20
Reply

Marsh Posté le 30-03-2010 à 19:50:51    

MSVC ne peut pas desambiguer les 2 variantes de resize apparement.

Reply

Marsh Posté le 30-03-2010 à 20:31:02    

Oui, on dirait bien... :/
 
je viens de tester sur ma machine perso avec gcc... et effectivement, là ça passe...

Reply

Marsh Posté le 02-04-2010 à 00:55:47    


comme dit 'Joel' , si la function est overloaded , le compiler ne peut
pas choisir le type exacte
-> tu ajoute un casting , pour specifier le type du fonction
et ca va marcher (j'ai tester ca avec un ancien gcc)
et je crois que ca marche partout.  :D  :heink:  

Reply

Marsh Posté le 02-04-2010 à 18:44:09    

Hello,  
 
Est ce que tu pourrais me montrer comment tu fais cela? (J'avoue ne pas être super a l'aise avec les pointeurs de fonctions. Quand on a gouté a boost::function<> j'ai même plus envie d'aller chercher plus loin :D
 
A coup de mix entre boost::bind, et boost::lambda::bind j'ai sorti un truc comme cela: (bon, qui "a priori" a l'air de compiler & marcher)

Code :
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. #include <boost/lambda/lambda.hpp>
  5. #include <boost/lambda/bind.hpp>
  6. #include <boost/function.hpp>
  7. #include <boost/bind.hpp>
  8. int main() {
  9.      using namespace boost;
  10.      size_t nb_elem = 10;
  11.      std::vector< std::vector< double > > matrix;
  12.      matrix.resize(nb_elem);
  13.      std::for_each(matrix.begin(), matrix.end(), lambda::bind(bind(&std::vector<double>::resize, _1, _2), lambda::_1, nb_elem, 0.));
  14.      for(size_t k = 0 ; k < matrix.size() ; ++k)
  15.           std::cout << matrix[k].size() << std::endl;
  16.      return 0;
  17. }


 
Je testerai avec gcc ce soir, mais j'ai un peu l'impression qu'il n'y a que VS pour compiler ca...  (je deviens un peu critique quand j'ai vu ce que VC++ 6 étais capable de compiler :S)  
# Je suis suis sous le 2008
 
Avec un vieux cast sur des pointeurs de fonction, j'ai tenté ça. mais bon, ca ne compile pas... comme dit précédemment les pointeurs de fonctions et moi...

Code :
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. #include <boost/lambda/lambda.hpp>
  5. #include <boost/lambda/bind.hpp>
  6. int main() {
  7.      using namespace boost::lambda;
  8.      size_t nb_elem = 10;
  9.      std::vector< std::vector< double > > matrix;
  10.      matrix.resize(nb_elem);
  11.      std::for_each(matrix.begin(), matrix.end(), bind(static_cast< void (std::vector<double>::*)(size_t, double)>(&std::vector<double>::resize), _1, nb_elem, 0.));
  12.      for(size_t k = 0 ; k < matrix.size() ; ++k)
  13.           std::cout << matrix[k].size() << std::endl;
  14.      return 0;
  15. }


 
 
Bon, dans tous les cas, pour ce type de cas je reviens sur un bon vieux for... Je compte pas vraiment faire du code de goret... c'est plus pour culture générale que j'aimerai bien savoir comment on aurait pus régler le pb...
 
Merci :)


Message édité par Amonchakai le 02-04-2010 à 18:49:23
Reply

Marsh Posté le 02-04-2010 à 18:44:09   

Reply

Marsh Posté le 03-04-2010 à 00:19:42    

Code :
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. #include <boost/lambda/lambda.hpp>
  5. #include <boost/lambda/bind.hpp>
  6. int main() {
  7. using namespace boost::lambda;
  8. size_t nb_elem = 10;
  9. std::vector< std::vector< double > > matrix;
  10. matrix.resize(nb_elem);
  11. std::for_each(matrix.begin(), matrix.end(),
  12. //bind(static_cast< void (std::vector<double>::*)(size_t, const double& )>(&std::vector<double>::resize), _1, nb_elem, 0.));
  13. bind(static_cast< void (std::vector<double>::*)(std::vector<double>::size_type, const std::vector<double>::value_type& )>(&std::vector<double>::resize), _1, nb_elem, 0.));
  14.   for(size_t k = 0 ; k < matrix.size() ; ++k)
  15.     std::cout << matrix[k].size() << std::endl;
  16.   return 0;
  17. }


 
c'est ton code , le cast est correct , mais les parameters! ... :sol:  
la deuxieme bind est peut etre plus compatible.
.. et si tu veut , utilise quelque typedef pour reduire la longueur .
et tu peut meme eviter ce bind .

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed