|
Boost Users : |
From: Vishnevetsky, Eugene \(IT\) (Eugene.Vishnevetsky_at_[hidden])
Date: 2005-07-05 21:06:27
I came across this problem in the real project where I don't control the
class that corresponds to class Y of the example, so I can't change the
signature of the member function. I could write a wrapper function that
takes Y*, but after some point the code with a simple 'for' loop becomes
cleaner and more readable than the one using lambda.
If this problem is not a bug, but an inherent limitation of the lambda
library or its current implementation, it would be nice if it is
mentioned in the documentation.
Thanks,
Eugene Vishnevetsky
Roman Krylov wrote:
Perhaps the only solution here is to use Y* instead of Y& with
corresponding modifications; this way there is no need for var() or smth
similar. Why not?
Vishnevetsky, Eugene (IT) wrote:
>Is it possible to use boost::ref() or boost::lambda::var() of
an
>abstract class as a parameter to boost::lambda::bind()?
>It seems that compiler attempts to instantiate an object of
that
>abstract class.
>Example:
>
>-----------------
>using namespace boost;
>using namespace boost::lambda;
>class Y
>{
>public:
> virtual void foo() = 0;
> void foo2 (){ }
>};
>class Z : public Y
>{
>public:
> void foo(){}
>};
>
>class TT
>{
>public:
> void test( Y& y ) { y.foo2(); }
>};
>
>int main()
>{
> std::vector<TT> xt;
> Z z;
> Y &y = z;
> std::for_each (xt.begin(), xt.end(), bind(&TT::test,_1,
>ref(y)));
> return 0;
>}
>----------------------
>
>And Error message from g++ (GCC) 3.2.3:
>
>---------------------------------
>/boost/tuple/detail/tuple_basic.hpp: In instantiation of
>`boost::tuples::cons<Y, boost::tuples::null_type>':
>/boost/tuple/detail/tuple_basic.hpp:326: instantiated from
>`boost::tuples::cons<boost::tuples::null_type,
boost::tuples::cons<Y,
>boost::tuples::null_type> >'
>/boost/tuple/detail/tuple_basic.hpp:326: instantiated from
>`boost::tuples::cons<void (TT::*const)(Y&),
>boost::tuples::cons<boost::tuples::null_type,
boost::tuples::cons<Y,
>boost::tuples::null_type> > >'
>/boost/lambda/detail/lambda_functor_base.hpp:151: instantiated
from
>`boost::lambda::detail::has_null_type<boost::tuples::cons<void
>(TT::*const)(Y&), boost::tuples::cons<boost::tuples::null_type,
>boost::tuples::cons<Y, boost::tuples::null_type> > > >'
>/boost/lambda/detail/lambda_functor_base.hpp:229: instantiated
from
>`boost::lambda::detail::deduce_non_ref_argument_types<boost::tuples::tu
>p
>le<void (TT::*const)(Y&), const
>boost::lambda::lambda_functor<boost::lambda::placeholder<1> >,
Y&,
>boost::tuples::null_type, boost::tuples::null_type,
>boost::tuples::null_type, boost::tuples::null_type,
>boost::tuples::null_type, boost::tuples::null_type,
>boost::tuples::null_type>, boost::tuples::null_type>'
>/boost/lambda/detail/lambda_functor_base.hpp:412: instantiated
from
>`boost::lambda::lambda_functor_base<boost::lambda::action<3,
>boost::lambda::function_action<3,
boost::lambda::detail::unspecified>
>>, boost::tuples::tuple<void (TT::*const)(Y&), const
>boost::lambda::lambda_functor<boost::lambda::placeholder<1> >,
Y&,
>boost::tuples::null_type, boost::tuples::null_type,
>boost::tuples::null_type, boost::tuples::null_type,
>boost::tuples::null_type, boost::tuples::null_type,
>boost::tuples::null_type> >::sig<boost::tuples::null_type>'
>/boost/lambda/detail/lambda_functors.hpp:135: instantiated from
>`boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost
:
>:lambda::action<3, boost::lambda::function_action<3,
>boost::lambda::detail::unspecified> >,
boost::tuples::tuple<void
>(TT::*const)(Y&), const
>boost::lambda::lambda_functor<boost::lambda::placeholder<1> >,
Y&,
>boost::tuples::null_type, boost::tuples::null_type,
>boost::tuples::null_type, boost::tuples::null_type,
>boost::tuples::null_type, boost::tuples::null_type,
>boost::tuples::null_type> > >'
>lamtest.cpp:35: instantiated from here
>/boost/tuple/detail/tuple_basic.hpp:320: cannot declare field
>`boost::tuples::cons<Y, boost::tuples::null_type>::head'
>to be
>of type `Y'
>/boost/tuple/detail/tuple_basic.hpp:320:
>because the following virtual functions are abstract:
>lamtest.cpp:12: virtual void Y::foo()
>----------------------------------------
>
>Thanks,
>
>Eugene Vishnevetsky
>--------------------------------------------------------
>
>NOTICE: If received in error, please destroy and notify sender.
Sender does not waive confidentiality or privilege, and use is
prohibited.
>
>_______________________________________________
>Boost-users mailing list
>Boost-users_at_[hidden]
>http://lists.boost.org/mailman/listinfo.cgi/boost-users
<http://lists.boost.org/mailman/listinfo.cgi/boost-users>
>
>
>
--------------------------------------------------------
NOTICE: If received in error, please destroy and notify sender. Sender does not waive confidentiality or privilege, and use is prohibited.
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net