【发布时间】:2015-08-29 05:22:26
【问题描述】:
我正在尝试包装一个表示要由 io_service 完成的工作的对象。
作业是任意类型的,不一定是 IO 操作。类似于here所描述的。
我已经能够发布绑定的常规函数,但无法发布成员函数。
为什么这段代码不能编译:
#include <iostream>
#include "boost/asio.hpp"
#include "boost/thread.hpp"
using namespace std;
namespace asio = boost::asio;
class class_fun1 {
public:
void an_expensive_calculation(int num) {
cout << "an_expensive_calculation: " << num << endl;
}
};
class class_fun2 {
public:
void a_long_running_task(int num) {
for (int x = 0; x < num; ++x)
cout << "a_long_running_task: " << num << endl;
}
};
int main(int argc, char** argv) {
int my_thread_count = 4;
asio::io_service io_service;
asio::io_service::work work(io_service);
boost::thread_group threads;
for (std::size_t i = 0; i < my_thread_count; ++i)
threads.create_thread(boost::bind(&asio::io_service::run, &io_service));
class_fun1 f1();
class_fun2 f2();
io_service.post(boost::bind(&class_fun1::an_expensive_calculation, &f1, 42));
io_service.post(boost::bind(&class_fun2::a_long_running_task, &f2, 123));
threads.join_all();
return 0;
}
虽然这个有效:
#include <iostream>
#include "boost/asio.hpp"
#include "boost/thread.hpp"
using namespace std;
namespace asio = boost::asio;
void an_expensive_calculation(int num) {
cout << "an_expensive_calculation: " << num << endl;
}
void a_long_running_task(int num) {
for (int x = 0; x < num; ++x)
cout << "a_long_running_task: " << num << endl;
}
int main(int argc, char** argv) {
int my_thread_count = 4;
asio::io_service io_service;
asio::io_service::work work(io_service);
boost::thread_group threads;
for (std::size_t i = 0; i < my_thread_count; ++i)
threads.create_thread(boost::bind(&asio::io_service::run, &io_service));
io_service.post(boost::bind(an_expensive_calculation, 42));
io_service.post(boost::bind(a_long_running_task, 123));
threads.join_all();
return 0;
}
我浏览了一些在线教程和文档,据我所知,首先应该可以使用。我遵循了绑定成员函数并将其发布到 io_service 的指南,但它不起作用。
【问题讨论】:
-
编译错误是什么?
标签: c++ c++11 boost boost-asio boost-bind