c++ - 在派生类方法上创建线程会导致错误
问题描述
我有一个抽象类如下:
class AbstractClass : public std::enable_shared_from_this<AbstractClass> {
public:
virtual ~AbstractClass() = default;
virtual bool Start() = 0;
virtual void Stop() = 0;
};
这是派生类:
class DerivedClass : public AbstractClass {
public:
bool Start() override;
void Stop() override;
}
我正在尝试在另一个文件中创建派生类的对象和派生类方法的线程:
// Create object
derivedClass_.reset(...);
//Start a thread for the derived class method
std::unique_ptr<boost::thread> derivedClassThread_;
derivedClassThread_.reset(new boost::thread(std::bind(&DerivedClass::Start,
derivedClass_)));
当我编译这个时,我得到了一些奇怪的错误:
错误:在 'class std::result_of<bool (DerivedClass::* const&(const volatile std::shared_ptr&))()>' 中没有名为 'type' 的类型
有人可以帮我吗?
解决方案
你的代码不是独立的,所以我们必须猜测。这是我认为你会拥有/想要的:
#include <boost/thread.hpp>
#include <memory>
#include <iostream>
class AbstractClass : public std::enable_shared_from_this<AbstractClass> {
public:
virtual ~AbstractClass() = default;
virtual bool Start() = 0;
virtual void Stop() = 0;
};
class DerivedClass : public AbstractClass {
public:
bool Start() override {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return true;
}
void Stop() override { }
};
int main()
{
// Create object
std::shared_ptr<AbstractClass> derivedClass_ =
std::make_shared<DerivedClass>();
// Start a thread for the derived class method
auto derivedClassThread_ = std::make_unique<boost::thread>(
[derivedClass_] { derivedClass_->Start(); });
if (derivedClassThread_ && derivedClassThread_->joinable())
derivedClassThread_->join();
derivedClassThread_ = std::make_unique<boost::thread>(
std::bind(&AbstractClass::Start, derivedClass_));
if (derivedClassThread_ && derivedClassThread_->joinable())
derivedClassThread_->join();
}
编译没有麻烦。
针对评论进行了更新,表明您实际上可以这样做
std::bind
。
印刷:
virtual bool DerivedClass::Start()
virtual bool DerivedClass::Start()
推荐阅读
- machine-learning - 无序数据的神经网络架构
- ios - 无法渲染和更新自动布局状态,无法启动可设计代理,因为工具正在关闭
- php - Woocommerce:将订单状态设置为在扫描 QR 码(包含订单 ID)时完成
- python - 为什么检查变量是否存在比复制应该是 O(1) vs O(n) 操作的数组花费更多时间?
- reactjs - 我正在尝试在 github 页面上部署我的静态反应应用程序,但我得到了白屏
- python - Python SQL cursor/fetch:数据库查询何时完成运行?
- laravel - 使用非默认保护登录后,我的尝试()函数传递了“真”但没有获得 auth()-user() 参数,因此无法启动会话
- c# - 在 EF Core 中使用现有子实体创建新实体
- node.js - 如果租借的书没有按时自动归还,MongoDB / Mongoose如何申请罚款?
- javascript - 您可以使用 file_get_contents() 在 PHP 中同时读取文件吗?