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);
}