C++ 如何传递参数以增强asio async_accept

C++ 如何传递参数以增强asio async_accept,c++,boost,bind,boost-asio,stdbind,C++,Boost,Bind,Boost Asio,Stdbind,我有一个问题 我正在使用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())); accep

我有一个问题

我正在使用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);
}
void CServerSocket::StartAccept(boost::asio::ip::tcp::acceptor&acceptor)
{
std::shared_ptr套接字(新的boost::asio::ip::tcp::socket(acceptor.get_io_service());
acceptor.async_accept(*socket,std::bind(&CServerSocket::OnAccept,boost::asio::placeholders::error,socket,
标准:参考(受体));
}
void CServerSocket::OnAccept(const boost::system::error\u code&error,std::shared\u ptr socket,
boost::asio::ip::tcp::acceptor和acceptor)
{
如果(错误)
{
CLogManager::WriteLog((boost::format(“接受错误!:%1%”)error.message()).str().c_str());
返回;
}
m_SocketList.push_back(std::make_shared(这个,socket));
startacept(接受者);
}
在std::bind上,发生了一个错误

“错误c2064项不计算为包含3个参数的函数”

我该怎么办


谢谢。

如果您使用的是
std::bind
,请将
boost::asio::placeholders::error
替换为
std::placeholders:::\u 1
接受处理程序只能将错误代码作为参数,请参阅:

我建议将
acceptor
设置为
CServerSocket
的成员,然后将调用更改为
async\u accept
致:


并在
OnAccept
成员函数中访问
acceptor

一个错误是您忘记了要绑定的实例。您需要将此作为第二个参数<代码>std::bind(&CServerSocket::OnAccept,this,boost::asio::占位符::error,socket,std::ref(acceptor))我已经试过了。但是,发生了另一个错误。错误1错误C2664:“\u Rx std::\u Pmf\u wrap::operator()(const\u Wrapper&、\u V0\u t、\u V1\u t、\u V2\t)const”:无法将“boost::arg”强制转换为“const boost::system::Error\u code&”。c:\program files(x86)\microsoft visual studio 11.0\vc\include\functional 1152um这是第二个错误,我想。。。您不能将std::bind与std::shared_ptr一起使用,而是使用boost::asio::占位符。看,这是不对的。瞧,谢谢你发现了我的错误@Igor。我已经修改了我的答案,使用
std::placeholder
而不是asio文档中的
boost::placeholder
。您的答案仍然意味着不可能(或不正确)传递到
CServerSocket::OnAccept
额外参数,这也是不正确的。
acceptor.async_accept(*socket, std::bind(&CServerSocket::OnAccept, this,
                                         std::placeholders::_1));