首页 > 解决方案 > 在派生类方法上创建线程会导致错误

问题描述

我有一个抽象类如下:

    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' 的类型

有人可以帮我吗?

标签: c++boostabstract-classvirtual-functions

解决方案


你的代码不是独立的,所以我们必须猜测。这是我认为你会拥有/想要的:

住在科利鲁

#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()

推荐阅读