Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用纯虚拟类创建boost线程_C++_Multithreading_Boost_G++_This - Fatal编程技术网

C++ 使用纯虚拟类创建boost线程

C++ 使用纯虚拟类创建boost线程,c++,multithreading,boost,g++,this,C++,Multithreading,Boost,G++,This,我正在尝试创建一个线程,其中回调类实现了operator()。该类包含一个纯虚方法。回调使用虚拟函数进行处理。下面是一个示例,它封装了这个想法并抛出了一些编译器错误: #include <boost/chrono.hpp> #include <boost/thread.hpp> #include <iostream> class Test { protected: int x; public: Test(voi

我正在尝试创建一个线程,其中回调类实现了
operator()
。该类包含一个纯虚方法。回调使用虚拟函数进行处理。下面是一个示例,它封装了这个想法并抛出了一些编译器错误:

#include <boost/chrono.hpp>
#include <boost/thread.hpp>
#include <iostream>

class Test {
    protected:
        int x;
    public:
        Test(void): x(10) {};
        virtual void operator()(void);
        boost::thread run(void);
        virtual void a(void) = 0;
};

void Test::operator()(void) {
    this->a();
    x += 10;
    std::cout << "Current Value:" << x << std::endl;
}

boost::thread Test::run(void) {
    return boost::thread(*this);
}

class Test1 : public Test {
    public:
        virtual void a(void);
};

void Test1::a(void) {
    x--;
}

main() {
    Test1 test = Test1();
    test.run().join();
}
当类具有纯虚方法时,使用
*this
作为函子似乎存在问题

  • 从概念上讲,是什么导致了错误
  • 如何以编译的方式实现此代码段中的功能

  • 顺便说一下,程序的预期输出是
    当前值:19

    boost::thread
    构造函数要求参数是可复制的,并按值获取它(如果它不是右值)。因此,您希望编译器创建一个抽象的
    Test
    实例,但它不同意:

    error: invalid abstract parameter type ‘Test’
    

    从概念上讲,问题是您试图创建一个
    测试
    对象,这是不可能的,因为它有一个纯虚拟函数。与您相关的编译错误就埋在那里的某个地方:

    /usr/include/boost/thread/detail/thread.hpp:292:18: note:   template argument deduction/substitution failed:
    /usr/include/boost/thread/detail/thread.hpp: In substitution of ‘template<class F> boost::thread::thread(F, typename boost::disable_if_c<boost::thread_detail::is_convertible<F&, boost::detail::thread_move_t<T> >::value, boost::thread::dummy*>::type) [with F = Test]’:
    test.cpp:22:31:   required from here
    /usr/include/boost/thread/detail/thread.hpp:292:18: error: invalid abstract parameter type ‘Test’
    test.cpp:5:7: note:   because the following virtual functions are pure within ‘Test’:
     class Test {
           ^
    
    [更新]或实际上更简单:

    boost::thread Test::run(void) {
        return boost::thread(&Test::operator(), this);
    }
    

    这是有道理的。如何修复它?我没有使用C++11。我正在研究两个选项:传入
    boost::ref(this)
    或将
    operator()
    放入嵌套结构并传入。两者大致相当于lambda,尽管后者可能更可取,因为它可以变得更安全。有什么想法吗?
    boost::thread Test::run(void) {
        return boost::thread([this]{
            this->operator();
        });
    }
    
    boost::thread Test::run(void) {
        return boost::thread(&Test::operator(), this);
    }