简体   繁体   English

std :: bind和boost :: bind与多态性之间的区别

[英]Difference between std::bind and boost::bind with polymorphism

I have a derived class from which I bind a virtual function that I did not override in this class, so I'm hoping to call the one of the parent class. 我有一个派生类,我绑定了一个虚函数,我没有在这个类中重写,所以我希望调用父类的一个。
It works nice with boost (1.55), but if I switch to std::bind from C++11, it refuse to compile with 它适用于boost(1.55),但如果我从C ++ 11切换到std :: bind,它拒绝编译

error C2100: illegal indirection 1> functional(1152) : see reference to function template instantiation '_Rx std::_Pmf_wrap<_Pmf_t,_Rx,_Farg0,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,>::operator ()(_Wrapper &) const' being compiled 1> with 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=Derived 1> ] 错误C2100:非法间接1>功能(1152):参见函数模板实例化'_Rx std :: _ Pmf_wrap <_Pmf_t,_Rx,_Farg0,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,> :: operator()( _Wrapper&)const'正在编译1> 1> [1> _Rx = bool,1> _Pmf_t = bool(__ thishisall 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>]

Here is a minimum code 这是最低限度的代码

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 

It's not a major issue, since I can stick with boost, but I would really want to know what's the difference between the two. 这不是一个重大问题,因为我可以坚持提升,但我真的想知道两者之间有什么区别。

I've checked few questions in here but I don't think how it will be related to this . 我在这里检查了几个问题,但我不认为它会如何与相关。 Checked stroustrup's site too here , but I did not see anything that could explain this behaviour. 在这里检查了stroustrup的网站,但我没有看到任何可以解释这种行为的东西。
What am I missing here ? 我在这里错过了什么?

Ps: I work with VS2012 Update 4, if this can help Ps:我使用VS2012 Update 4,如果这可以帮助

Visual Studio 2012 has a lot of bugs relating to std::function and std::bind . Visual Studio 2012有很多与std::functionstd::bind相关的错误。 This is one of them; 这是其中之一; the code will work in both Visual Studio 2010 and Visual Studio 2013. 该代码将在Visual Studio 2010和Visual Studio 2013中都有效。

The best choice is to use Boost.Function and Boost.Bind exclusively. 最好的选择是独占使用Boost.Function和Boost.Bind。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM