Error C2682:无法使用dynamic_cast将boost::exception_ptr转为const T*
错误根因
boost::exception_ptr是封装了异常对象的Wrapper类型,并非异常实例本身,无法直接通过dynamic_cast转换为自定义异常类型的指针,因此触发C2682编译错误。
修复方案
仅需要修改ExceptionHelper.h中的Contains模板函数,通过重抛异常+类型捕获的方式判断异常类型,无需调整上层调用逻辑:
#include <boost/exception_ptr.hpp> template <typename T> static bool Contains(boost::exception_ptr exception) { // 空指针直接返回false if (!exception) { return false; } try { // 重抛exception_ptr持有的真实异常对象 boost::rethrow_exception(exception); } catch (const T&) { // 匹配到目标类型返回true return true; } catch (...) { // 其他类型返回false return false; } }
效果验证
修改完成后重新编译即可消除C2682错误,原有AsioThread.cpp中的异常判断逻辑可以正常运行,准确识别AsioThreadException类型的异常。
内容的提问来源于stack exchange,提问作者SirKappe
相关产品推荐
相关产品推荐

