Linux下boost::asio::io_service::run重载歧义报错如何解决?
解决方案
一、boost::asio::io_service::run 重载歧义修复
错误原因说明
直接取&boost::asio::io_service::run时,编译器无法区分两个签名不同的重载版本,因此报歧义错误;你尝试的&boost::asio::io_service::run()属于语法错误,该写法是调用run()后取返回值的地址,不是取函数本身的地址。
注意你的代码中还存在两处笔误:
boost::assio::io_service拼写错误,应为boost::asio::io_servicepushback应为push_back
方法1:显式指定函数指针类型(boost::bind场景)
通过static_cast显式指定你要使用的无参版本run()对应的函数指针类型,即可解决歧义:
std::vector<boost::thread> threadPool; boost::asio::io_service IOService; // ... // 显式转型为无参版本的成员函数指针类型 threadPool.push_back(boost::thread( boost::bind( static_cast<std::size_t (boost::asio::io_service::*)()>(&boost::asio::io_service::run), &IOService ) ));
方法2:使用lambda表达式(更简洁,推荐)
不需要取函数地址,直接在lambda体内调用无参run(),编译器会自动匹配到正确的重载,完全避开歧义问题,GCC 4.8.5完全支持该写法:
threadPool.push_back(boost::thread([&IOService]() { return IOService.run(); }));
二、Eclipse单独报错的问题说明
仅Eclipse错误窗口提示报错、Make编译控制台无报错,是Eclipse CDT自带的静态语法解析器的缺陷导致的,不属于代码错误、编译错误或链接错误。
Eclipse对C++模板、重载函数转型、lambda等语法的解析能力弱于GCC,只要实际编译通过即可正常运行。可通过更新Eclipse CDT插件版本,或在问题面板过滤对应错误提示消除干扰。
内容的提问来源于stack exchange,提问作者JeffJway
相关产品推荐
相关产品推荐

