【问题标题】:Binding with boost works while with std doesnt, whats the diffrence?绑定 boost 有效,而 std 无效,有什么区别?
【发布时间】:2013-05-18 04:54:35
【问题描述】:

我试图用 std::bind 绑定一个函数,它一直说我的参数集没有重载。它与 boost::bind 一起工作。 std 和 boost 绑定有什么区别?

我正在使用:

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”的实例 匹配参数列表 参数类型是: (void (Messenger::*)(const boost::system::error_code &error, size_t bytes_transferred, char *message, int bufferSize, boost::asio::ip::tcp::socket *socketPtr, void (*onMessageReceivedCallback)(char *message, std::string 主机名, int 端口, int 长度)), Messenger *, std::_Ph, std::_Ph, 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 Messenger

很多这样的错误:

错误 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 ( _th​​iscall _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));
    }
}

【问题讨论】:

  • 你能发布足够的代码让我们复制错误吗?或者至少粘贴确切的错误。在std::bind 行中还有一个额外的)。
  • thx,括号去掉了,这不是问题,只是复制的结果
  • "105 IntelliSense:" - 你的意思是 IntelliSense 的错误吗?必须尝试编译代码吗?
  • Error 81 error C2780 是编译错误,不是吗?我试图编译它,但是有很多编译错误。

标签: boost boost-bind stdbind


【解决方案1】:

不同的是std::bind默认只接受5 arguments。将 _VARIADIC_MAX 宏设置为 10,以增加可变参数模板中的最大 arg 数。

【讨论】:

  • 好像是这种问题。此解决方案有效,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 2017-03-05
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
相关资源
最近更新 更多