Re: вопрос по boost::lambda
От: MaximE Великобритания  
Дата: 02.07.05 15:34
Оценка: 3 (1)
On Sat, 02 Jul 2005 14:48:04 +0400, pf79 <37257@users.rsdn.ru> wrote:

> Есть такой код:

>
> namespace Filter{
>
> class ResultType {...};
> class SubExpression
> {
> public:
>   virtual ResultType Result()=0;
> };
> typedef boost::shared_ptr<SubExpression> SPtrSubExpression;
> ............
> void F()
> {
>    namespace la=boost::lambda;
>    ResultType r;
>    vector<SPtrSubExpression> v;
> ..................................
>    vector<SPtrSubExpression>::const_iterator i=find_if(v.begin(), v.end(),
>         la::bind(&SubExpression::Result, *la::_1)==r);
> }
>
> }
>

>
> На что компилер вываливает ошибку:
>

> c:\Program Files\boost-1-32-0\boost\tuple\detail\tuple_basic.hpp(419): error C2259: 'Filter::SubExpression' : cannot instantiate abstract class

>
> Если чисто виртуальную ф-цию Result() заменить на просто виртуальную — то все компилит. Но этого делать не хочется по различным соображениям.

Проблема в том, что результат lambda выражения *la::_1 передается по значению. Так как класс у тебя абстрактный передать его по значению нельзя. Нужно передать по ссылке (здесь указателю) так: &*la::_1.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.