C++为派生类方法创建boost::thread出现result_of编译错误如何解决?
错误原因
这个编译报错的核心是std::bind无法匹配传入的成员函数指针与调用对象的类型,通常由以下两种情况导致:
- 你的
derivedClass_变量类型为std::shared_ptr<AbstractClass>,但你绑定的是DerivedClass的成员函数,二者类型不匹配,std::bind无法完成隐式类型转换。 - 部分旧版本编译器对直接传入智能指针作为成员函数调用对象的支持存在缺陷,导致类型推导失败。
额外注意:你给出的DerivedClass定义末尾遗漏了分号,需要修正为};否则也会触发编译错误。
解决方案
方案1:绑定基类虚函数(最推荐,适配基类智能指针场景)
如果你声明derivedClass_用的是基类智能指针类型,直接绑定基类的虚函数即可,运行时会自动调用派生类的实现:
derivedClassThread_.reset(new boost::thread(std::bind(&AbstractClass::Start, derivedClass_)));
方案2:显式转换为派生类智能指针
如果你确定derivedClass_指向的是DerivedClass实例,可以通过智能指针类型转换后再绑定:
derivedClassThread_.reset(new boost::thread(std::bind(&DerivedClass::Start, std::static_pointer_cast<DerivedClass>(derivedClass_))));
方案3:用Lambda替代std::bind
Lambda写法可读性更强,也可以完全规避std::bind的类型匹配问题,更推荐日常使用:
derivedClassThread_.reset(new boost::thread([derivedClass_]() -> bool { return derivedClass_->Start(); }));
内容的提问来源于stack exchange,提问作者cplusplus_new
相关产品推荐
相关产品推荐

