Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1826 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Boost lambda et objet complexe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Boost lambda et objet complexe

n°1977884
Amonchakai
Posté le 26-03-2010 à 19:10:39  profilanswer
 

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

mood
Publicité
Posté le 26-03-2010 à 19:10:39  profilanswer
 

n°1977893
Evadream -​jbd-
Posté le 26-03-2010 à 21:41:29  profilanswer
 

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));


 

n°1977894
Joel F
Real men use unique_ptr
Posté le 26-03-2010 à 21:46:16  profilanswer
 

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

n°1977895
Amonchakai
Posté le 26-03-2010 à 21:59:31  profilanswer
 

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

n°1979081
Amonchakai
Posté le 30-03-2010 à 17:12:27  profilanswer
 

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
n°1979085
Amonchakai
Posté le 30-03-2010 à 17:18:37  profilanswer
 

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
n°1979174
Joel F
Real men use unique_ptr
Posté le 30-03-2010 à 19:50:51  profilanswer
 

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

n°1979185
Amonchakai
Posté le 30-03-2010 à 20:31:02  profilanswer
 

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

n°1980230
__tomjost
c'est un pseudo !
Posté le 02-04-2010 à 00:55:47  profilanswer
 


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:  

n°1980508
Amonchakai
Posté le 02-04-2010 à 18:44:09  profilanswer
 

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
mood
Publicité
Posté le 02-04-2010 à 18:44:09  profilanswer
 

n°1980590
__tomjost
c'est un pseudo !
Posté le 03-04-2010 à 00:19:42  profilanswer
 

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 .


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Boost lambda et objet complexe

 

Sujets relatifs
Aide pour modèle objet. moteur d'ordre?[JAVA] Communication Objet
[résolu] Parcourir un objet?erreur objet attendu
[boost] Parsing de fichiers simples mais très gros[Résolu] [Access2007] Création requete complexe
Problème copie d'objet et serialisation[WCF] Comment passer un objet en paramètre ?
Requete SQL de selection complexe[boost::serialization] Serialization de classes "inconnues"
Plus de sujets relatifs à : Boost lambda et objet complexe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR