【发布时间】:2013-12-19 22:34:28
【问题描述】:
我有一个问题。
我正在开发聊天服务器,使用 boost::asio。
这里,
void CServerSocket::StartAccept(boost::asio::ip::tcp::acceptor &acceptor)
{
std::shared_ptr<boost::asio::ip::tcp::socket> socket(new boost::asio::ip::tcp::socket(acceptor.get_io_service()));
acceptor.async_accept(*socket, std::bind(&CServerSocket::OnAccept, boost::asio::placeholders::error, socket,
std::ref(acceptor)));
}
void CServerSocket::OnAccept(const boost::system::error_code &error, std::shared_ptr<boost::asio::ip::tcp::socket> socket,
boost::asio::ip::tcp::acceptor &acceptor)
{
if (error)
{
CLogManager::WriteLog((boost::format("Accept error! : %1%") % error.message()).str().c_str());
return;
}
m_SocketList.push_back(std::make_shared<CConnectionSocket>(this, socket));
StartAccept(acceptor);
}
在 std::bind 处发生错误。
“错误 c2064 术语不计算为采用 3 个参数的函数”
我该怎么办?
谢谢。
【问题讨论】:
-
一个错误是您忘记了要绑定的实例。你需要一个 this 作为第二个参数。
std::bind(&CServerSocket::OnAccept, this, boost::asio::placeholders::error, socket, std::ref(acceptor)) -
我已经试过了。但是,发生了另一个错误。错误 1 错误 C2664: '_Rx std::_Pmf_wrap<_pmf_t>>::operator ()<:cserversocket>(const _Wrapper &,_V0_t,_V1_t,_V2_t) const':不能将 'boost::arg' 转换为 'const boost::system::error_code &'。 c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional 1152
-
嗯,这是第二个错误,我认为...您不能将 std::bind 与 std::shared_ptr 一起使用,但 boost::asio::placeholders。见here
标签: c++ boost bind boost-asio stdbind