Есть такой код:
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() заменить на просто виртуальную — то все компилит. Но этого делать не хочется по различным соображениям.
В чем я неправ ??
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 YegorushkinPosted via RSDN NNTP Server 1.9
Еще один вопрос появился.
Есть код:
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
Здравствуйте, 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));