Я нахожусь в процессе обучения boost :: lambda, и мне удалось создать ситуацию, которую я не могу решить с помощью того, что я знаю до сих пор.
Видимо, в недрах boost :: lambda, следующий пример вызывает попытку создания экземпляра абстрактного класса AbstractFoo и предотвращает компиляцию лямбда-выражения. Проблема в том, что я не знаю, почему он пытается создать его экземпляр, поэтому я не могу попытаться обойти это.
Любое повышение :: Лямбда-эксперты, которые могут:
- Дайте мне понять, почему это происходит?
- предложить обходной путь?
Пример:
#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
struct AbstractFoo
{
typedef boost::shared_ptr<AbstractFoo> Ptr;
virtual int it() const = 0;
};
struct Bar : public AbstractFoo
{
typedef boost::shared_ptr<Bar> Ptr;
virtual int it() const { return 3; }
};
typedef AbstractFoo Foo; // Comment this out
//typedef Bar Foo; // and this in to make this example compilable
int main()
{
namespace bll = boost::lambda;
boost::function< bool (const Foo::Ptr &)> func;
func = (bll::protect(bll::bind( &Foo::it, *bll::_1))(bll::_1) == 3);
return 0;
}
Не удается скомпилировать (в gcc 4.4.3, boost 1_40) ошибку шаблона монстра, важной частью которой является:
error: cannot declare field
‘boost::tuples::cons<AbstractFoo,boost::tuples::null_type>::head’
to be of abstract type ‘AbstractFoo’
because the following virtual functions are pure within ‘AbstractFoo’:
virtual int AbstractFoo::it() const