1

std::bind で関数をバインドしようとしましたが、引数のセットにオーバーロードがないと言い続けました。boost::bind で動作しました。std と boost bind の違いは何ですか?

私は使用しています:

Microsoft Visual Studio Ultimate 2012 バージョン 11.0.60315.01 アップデート 2

ブースト 1.53.0

func 宣言とバインディング:

void Messenger::receiveCallback(const boost::system::error_code& error, size_t bytes_transferred, char* message, int bufferSize, tcp::socket* socketPtr, void(*onMessageReceivedCallback)(char* message, string hostname, int port, int length));

std::bind(&Messenger::receiveCallback, this, std::placeholders::_1, std::placeholders::_2, message, bufferSize, socketPtr, onMessageReceivedCallback);//error

boost::bind(&Messenger::receiveCallback, this, _1, _2, message, bufferSize, socketPtr, onMessageReceivedCallback);

エラー:

105 IntelliSense: オーバーロードされた関数 "std::bind" のインスタンスが引数リストに一致しません, boost::asio::ip::tcp::socket *socketPtr, void (*onMessageReceivedCallback)(char *message, std::string hostname, int port, int length)), Messenger *, std::_Ph<1 >, std::_Ph<2>, char *, int, boost::asio::ip::tcp::socket , void ( )(char *message, std::string ホスト名, int ポート, int 長さ)) c:\Users\gospo_000\Source\Repos\Messenger\Messenger\Messenger\Messenger.cpp 176 4 メッセンジャー

このような多くのエラー:

エラー 81 エラー C2780: 'enable_if::value,std::_BindRx(_thiscall _Farg0::* )(_V0_t,_V1_t,_V2_t,_V3_t,_V4_t),_Rx,_Farg0,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t>,_Vx0_t ,_Vx1_t>>::type std::bind( Rx ( _thiscall _Farg0::* const )(_V0_t,_V1_t,_V2_t,_V3_t,_V4_t),_Vx0_t &&,_Vx1_t &&)' : 3 つの引数を想定 - 8 つの引数を指定 c:\ users\gospo_000\source\repos\messenger\messenger\messenger\messenger.cpp 176 1 tester2

Messenger.h

#include <string>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include "Connection.h"
#include "Message.h"
#include <unordered_map>

using namespace std;
using namespace boost::asio;
using boost::asio::ip::tcp;


class Messenger
    {
   //.............................
          void receiveCallback(const boost::system::error_code& error, size_t bytes_transferred, char* message, int bufferSize, tcp::socket* socketPtr, void(*onMessageReceivedCallback)(char* message, string hostname, int port, int length));
    };

Messenger.cpp

void Messenger::receiveCallback(const boost::system::error_code& error, size_t bytes_transferred, char* message, int bufferSize, tcp::socket* socketPtr, void(*onMessageReceivedCallback)(char* message, string hostname, int port, int length))
{
    if(error)
    {
        string connectionId = getConnectionId(socketPtr->remote_endpoint());
        connections_.erase(connectionId);
        cout<<error.message();
    }
    else
    {
        onMessageReceivedCallback(message, socketPtr->remote_endpoint().address().to_string(), socketPtr->remote_endpoint().port(), bytes_transferred);
        socketPtr->async_receive(
            boost::asio::buffer(message, bufferSize),
            boost::bind(&Messenger::receiveCallback, this, _1, _2, message, bufferSize, socketPtr, onMessageReceivedCallback));
    }
}
4

1 に答える 1

1

違いは、デフォルトで5 つの引数std::bindしかとらないことです。可変個引数テンプレートの最大引数数を増やすために、_VARIADIC_MAX マクロを 10 に設定します。

于 2013-05-23T10:20:07.053 に答える