вопрос по boost::lambda
От: pf79 Украина  
Дата: 02.07.05 10:48
Оценка:
Есть такой код:
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


Компилер VC++ 7.1
boost 1.32.0

Если чисто виртуальную ф-цию Result() заменить на просто виртуальную — то все компилит. Но этого делать не хочется по различным соображениям.
В чем я неправ ??
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
Re[2]: вопрос по boost::lambda
От: pf79 Украина  
Дата: 03.07.05 09:17
Оценка:
Здравствуйте, MaximE, Вы писали:

.......
Ясна, спасибо.
Re: вопрос по boost::lambda
От: pf79 Украина  
Дата: 27.07.05 16:19
Оценка:
Еще один вопрос появился.
Есть код:

 typedef map <int, double> M;
 M m;
 vector<int> v;
 namespace la=boost::lambda;
 for_each(v.begin(), v.end(), la::bind(&M::find, boost::cref(m), la::_1));// m.find(_1)

Не компилится.
Хотя похожий в общем то код:
 typedef vector<int> V;
 V m;
 vector<int> v;
 namespace la=boost::lambda;
 for_each(v.begin(), v.end(), la::bind(&M::push_back, boost::ref(m), la::_1));// m.push_back(_1)

Подозреваю что дело в возвращаемом find() значении. Однако как заставить работать не могу придумать.
boost 1-32-0
VC 7.1
Re[2]: вопрос по boost::lambda
От: MaximE Великобритания  
Дата: 27.07.05 18:14
Оценка:
Здравствуйте, pf79, Вы писали:

P>Еще один вопрос появился.

P>Есть код:

P>
P> typedef map <int, double> M;
P> M m;
P> vector<int> v;
P> namespace la=boost::lambda;
P> for_each(v.begin(), v.end(), la::bind(&M::find, boost::cref(m), la::_1));// m.find(_1)
P>

P>Не компилится.

Проблема в том, map::find — перегруженная ф-ция, поэтому тебя явно нужно указать, какую ты имеешь ввиду.

 M::const_iterator(M::*mem_fn)(int const&)const = &M::find; // выберем константный find
 for_each(v.begin(), v.end(), la::bind(mem_fn, &m, la::_1));
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.