boost::asio::connect编译失败提示'this'指针为空如何解决
错误原因及修复方案
1 先修复resolve调用的语法错误
你当前resolve调用的括号位置错误,原本要作为错误码参数传入的ec被放到了函数参数括号外,变成了逗号运算的右值,既没有正确传递给resolve检测解析错误,还会引发语法异常:
原错误代码:
auto endpoints = resolver->resolver().resolve(ip_address, std::to_string(port)), ec);
修正为:
auto endpoints = resolver->resolver().resolve(ip_address, std::to_string(port), ec);
2 修复boost::asio::connect的调用匹配问题
Boost 1.77版本中,传入迭代器对+error_code的connect重载匹配要求严格,你当前的写法会被误匹配到需要传入连接条件函数的四参数重载,导致编译报错。有两种修复方案可选:
方案A:直接传入resolve返回的endpoint范围(更简洁,推荐)
Boost.Asio支持直接传入resolve返回的结果范围作为参数,不用手动传迭代器起止,会自动匹配带error_code的重载:
// 连接服务器 boost::asio::ip::tcp::endpoint m_endpoint; auto it = boost::asio::connect(_socket, endpoints, ec); if (ec) return; m_endpoint = *it;
方案B:补全迭代器版本的参数占位
如果你坚持要传迭代器起止,需要显式匹配重载,同时要注意先判断错误码再解引用返回的迭代器,避免运行时空引用崩溃:
// 连接服务器 boost::asio::ip::tcp::endpoint m_endpoint; auto it = boost::asio::connect(_socket, endpoints.begin(), endpoints.end(), {}, ec); if (ec) return; m_endpoint = *it;
这里传入的{}是空的连接条件,用来匹配五参数的重载,让最后一个参数正确识别为error_code类型。
额外注意点
无论用哪种方案,都必须先判断ec是否有错误,再解引用connect返回的迭代器,否则连接失败时返回的是end()迭代器,直接解引用会触发未定义行为导致程序崩溃。
内容的提问来源于stack exchange,提问作者Hung Law
相关产品推荐
相关产品推荐

