我正在尝试使用boost编译项目,将asio::io_service绑定到boost::thread,并且收到一些我不知道如何解决的错误: IBM XL C/C++ for AIX,V11.1 (5724-X13),Version: 11.01.0000.0006 (AIX 7.1)
"/home/clag/projects/tomas/include/boost/asio/detail/posix_fd_set_adapter.hpp", line 33.30: 1540-0198 (W) The omitted keyword "private" is assumed for base class "noncopyable".
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 50.46: 1540-0219 (S) The call to "boost::bind" has no best match.
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 50.58: 1540-1229 (I) Argument number 1 is an rvalue of type "overloaded function: boost::asio::io_service::run".
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 50.100: 1540-1229 (I) Argument number 2 is an rvalue of type "const boost::reference_wrapper<const boost::asio::io_service>".
"/home/clag/projects/tomas/include/boost/bind/bind_mf_cc.hpp", line 30.5: 1540-1202 (I) No candidate is better than "boost::bind<unsigned long,boost::asio::io_service,boost::reference_wrapper<const boost::asio::io_service> >(unsigned long (io_service::*)() const, reference_wrapper<const boost::asio::io_service>)".
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 50.58: 1540-1231 (I) The conversion from argument number 1 to "unsigned long (boost::asio::io_service::*)() const" uses the resolved overloaded function "size_t boost::asio::io_service::run()".
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 50.100: 1540-1231 (I) The conversion from argument number 2 to "boost::reference_wrapper<const boost::asio::io_service>" uses "the identity conversion".
"/home/clag/projects/tomas/include/boost/bind/bind_mf_cc.hpp", line 20.5: 1540-1202 (I) No candidate is better than "boost::bind<unsigned long,boost::asio::io_service,boost::reference_wrapper<const boost::asio::io_service> >(unsigned long (io_service::*)(), reference_wrapper<const boost::asio::io_service>)".
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 50.58: 1540-1231 (I) The conversion from argument number 1 to "unsigned long (boost::asio::io_service::*)()" uses the resolved overloaded function "size_t boost::asio::io_service::run()".
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 50.100: 1540-1231 (I) The conversion from argument number 2 to "boost::reference_wrapper<const boost::asio::io_service>" uses "the identity conversion".
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 52.35: 1540-0219 (S) The call to "boost::bind" has no best match.
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 52.47: 1540-1229 (I) Argument number 1 is an rvalue of type "overloaded function: boost::asio::io_service::run".
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 52.98: 1540-1229 (I) Argument number 2 is an rvalue of type "boost::asio::io_service *".
"/home/clag/projects/tomas/include/boost/bind/bind_mf_cc.hpp", line 30.5: 1540-1202 (I) No candidate is better than "boost::bind<unsigned long,boost::asio::io_service,boost::asio::io_service *>(unsigned long (io_service::*)() const, io_service *)".
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 52.47: 1540-1231 (I) The conversion from argument number 1 to "unsigned long (boost::asio::io_service::*)() const" uses the resolved overloaded function "size_t boost::asio::io_service::run()".
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 52.98: 1540-1231 (I) The conversion from argument number 2 to "boost::asio::io_service *" uses "the identity conversion".
"/home/clag/projects/tomas/include/boost/bind/bind_mf_cc.hpp", line 20.5: 1540-1202 (I) No candidate is better than "boost::bind<unsigned long,boost::asio::io_service,boost::asio::io_service *>(unsigned long (io_service::*)(), io_service *)".
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 52.47: 1540-1231 (I) The conversion from argument number 1 to "unsigned long (boost::asio::io_service::*)()" uses the resolved overloaded function "size_t boost::asio::io_service::run()".
"/home/clag/projects/tomas/ots/src/agent/agent.cc", line 52.98: 1540-1231 (I) The conversion from argument number 2 to "boost::asio::io_service *" uses "the identity conversion".
"/home/clag/projects/tomas/include/boost/asio/impl/write.hpp", line 276.7: 1540-0198 (W) The omitted keyword "private" is assumed for base class "detail::base_from_completion_cond<CompletionCondition>".
"/home/clag/projects/tomas/include/boost/asio/impl/write.hpp", line 276.7: 1540-0198 (W) The omitted keyword "private" is assumed for base class "detail::base_from_completion_cond>boost::asio::detail::transfer_all_t>"
导致错误的代码:
acceptor_thread_.reset(new boost::thread(boost::bind(&boost::asio::io_service::run, boost::cref(*accept_io_service_))));
for (int i = 0; i < agent_config_.threads(); i++) {
thread_group_.create_thread(boost::bind(&boost::asio::io_service::run, work_io_service_.get()));
}
定义:
boost::shared_ptr<boost::asio::io_service> accept_io_service_;
boost::shared_ptr<boost::thread> acceptor_thread_;
boost::shared_ptr<boost::asio::io_service> work_io_service_;
boost::thread_group thread_group_;
顺便提一下,这可能只是一个标志选项,但我在任何地方都找不到它,因为相同的代码在Linux(GCC)、HP-UX(aCC)和Windows(MSVC)上编译得很好。
Thx请求帮助
发布于 2013-02-21 16:30:22
google快速搜索表明AIX在重载解析方面存在问题,尤其是在涉及模板的情况下。因此,尝试不同的方法来减少需要发生的重载分辨率的数量可能是值得的。
例如,可以用boost::mem_fn()
代替boost::bind()
。
std::size_t (io_service::*run)() = &io_service::run;
boost::thread t(boost::mem_fn(run), io_service);
此外,如果编译器在解决重载时仍然有问题,那么可以考虑编写一个简单的functor。boost::thread()
构造函数的唯一要求是func
参数是可复制的,并且func()
必须是有效的表达式。
struct service_runner
{
explicit service_runner(boost::shared_ptr<boost::asio::io_service> io_service)
: io_service(io_service)
{}
std::size_t operator()() { return io_service->run(); }
boost::shared_ptr<boost::asio::io_service> io_service;
};
...
boost::thread t((service_runner(io_service)));
其他需要考虑的问题:
io_service::run()
是一个非常数成员函数,但绑定到它的accept_io_service
实例参数作为常量引用通过boost::cref()
传递。需要添加编译器标志,如gcc的-fpermissive
,以允许编译不符合规范的代码。在使用这些选项时要非常小心,因为它们可能会屏蔽将boost::shared_ptr
作为实例句柄传递给绑定调用的严重problems.io_service
保持活动状态,只要线程仍在运行。否则,该io_service
可能会在线程仍在处理其事件循环时被删除,从而导致调用未定义行为的可能性很高。发布于 2013-02-25 16:41:30
只是出于好奇,您是否正在为您正在使用的编译器使用IBM boost库补丁?http://www-01.ibm.com/support/docview.wss?uid=swg27006911
发布于 2013-02-25 16:59:35
查看尝试的4个可能候选者的消息,差异似乎与const相关
No candidate is better than "boost::bind<unsigned long,boost::asio::io_service,boost::reference_wrapper<const boost::asio::io_service> >(unsigned long (io_service::*)() const, reference_wrapper<const boost::asio::io_service
>)".
No candidate is better than "boost::bind<unsigned long,boost::asio::io_service,boost::reference_wrapper<const boost::asio::io_service> >(unsigned long (io_service::*)(), reference_wrapper<const boost::asio::io_service>)".
No candidate is better than "boost::bind<unsigned long,boost::asio::io_service,boost::asio::io_service *>(unsigned long (io_service::*)() const, io_service *)".
No candidate is better than "boost::bind<unsigned long,boost::asio::io_service,boost::asio::io_service *>(unsigned long (io_service::*)(), io_service *)".
由于您使用的是V11.1编译器,因此有两个缺省情况下未启用的修复程序,您可以尝试使用以下选项
-qxflag=EnableIssue214PartialOrdering这将启用与C++核心语言问题214相关的几个修复
-qxflag=FunctionCVTmplArgDeduction2011这使得一些C++2011澄清可以用来进行参数推导
这些更改是V12.1编译器的默认更改,但不是V11.1编译器的默认更改
https://stackoverflow.com/questions/14999867
复制相似问题