Разница между std :: bind и boost :: bind с полиморфизмом

У меня есть производный класс, из которого я привязываю виртуальную функцию, которую я не переопределил в этом классе, поэтому я надеюсь вызвать одну из родительских классов.
Он отлично работает с boost (1.55), но если я переключусь на std :: bind с C ++ 11, он откажется компилироваться с

ошибка C2100: недопустимое косвенное обращение 1> функционал (1152): см. ссылку на создание экземпляра шаблона функции '_Rx std :: _ Pmf_wrap ‹_Pmf_t, _Rx, _Farg0, _V0_t, _V1_t, _V2_t, _V3_t, _V4_t, _V5_t,> :: _Wrapper &) const 'компилируется 1> с 1> [1> _Rx = bool, 1> _Pmf_t = bool (__thiscall Base :: *) (void), 1> _Farg0 = Base, 1> _V0_t = std :: _ Nil, 1> _V1_t = std :: _ Nil, 1> _V2_t = std :: _ Nil, 1> _V3_t = std :: _ Nil, 1> _V4_t = std :: _ Nil, 1> _V5_t = std :: _ Nil, 1> = std: : _Nil, 1> _Wrapper = Производный 1>]

Вот минимальный код

class Runnable { virtual bool Run() =0;};
class Base : public Runnable { bool Run() {/*do stuff*/ return true;}};
class Derived : public Base {};

Derived d;
std::function<bool()> f = std::bind(&Derived::Run,std::ref(d)); //Do not compile
std::function<bool()> f = boost::bind(&Derived::Run,boost::ref(d)); //compile 

Это не серьезная проблема, так как я могу придерживаться ускорения, но мне действительно хотелось бы знать, в чем разница между ними.

Я проверил здесь несколько вопросов, но не думаю, как это будет связано с это. Также проверил сайт stroustrup здесь, но я не нашел ничего, что может объяснить такое поведение.
Что мне здесь не хватает?

Ps: работаю с VS2012 Update 4, если может поможет


person Kiroxas    schedule 26.02.2014    source источник
comment
Работает ли это? В противном случае это может быть ошибка в одной из реализаций стандартной библиотеки.   -  person chris    schedule 26.02.2014
comment
Не компилируется, нет.   -  person Kiroxas    schedule 26.02.2014


Ответы (1)


В Visual Studio 2012 много ошибок, связанных с std::function и std::bind. Это один из них; код будет работать как в Visual Studio 2010, так и в Visual Studio 2013.

Лучше всего использовать исключительно Boost.Function и Boost.Bind.

person Collin Dauphinee    schedule 26.02.2014