C++ websocketpp回调(通过函数指针的类方法)

C++ websocketpp回调(通过函数指针的类方法),c++,class,callback,C++,Class,Callback,我举了一个例子,创建了一个简单的类,如下所示: namespace __webauth__ { struct ws_config: public websocketpp::config::asio { // pull default settings from our core config typedef websocketpp::config::asio core; typedef core::concurrency_type concurrency_type;

我举了一个例子,创建了一个简单的类,如下所示:

namespace __webauth__ {

struct ws_config: public websocketpp::config::asio {
    // pull default settings from our core config
    typedef websocketpp::config::asio core;

    typedef core::concurrency_type concurrency_type;
    typedef core::request_type request_type;
    typedef core::response_type response_type;
    typedef core::message_type message_type;
    typedef core::con_msg_manager_type con_msg_manager_type;
    typedef core::endpoint_msg_manager_type endpoint_msg_manager_type;

    typedef core::alog_type alog_type;
    typedef core::elog_type elog_type;
    typedef core::rng_type rng_type;
    typedef core::endpoint_base endpoint_base;

    static bool const enable_multithreading = true;

    struct transport_config: public core::transport_config {
        typedef core::concurrency_type concurrency_type;
        typedef core::elog_type elog_type;
        typedef core::alog_type alog_type;
        typedef core::request_type request_type;
        typedef core::response_type response_type;

        static bool const enable_multithreading = true;
    };

    typedef websocketpp::transport::asio::endpoint<transport_config> transport_type;

    static const websocketpp::log::level elog_level =
            websocketpp::log::elevel::none;
    static const websocketpp::log::level alog_level =
            websocketpp::log::alevel::none;

    /// permessage_compress extension
    struct permessage_deflate_config {
    };

    typedef websocketpp::extensions::permessage_deflate::enabled<
            permessage_deflate_config> permessage_deflate_type;
};

typedef websocketpp::server<ws_config> server;

// use placeholders
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;

// define message type
typedef server::message_ptr message_ptr;

// define property tree (JSON)
using boost::property_tree::ptree;
using boost::property_tree::basic_ptree;

class Dispatcher {
public:
    void start();

private:
    server dispatcher;       // Create a server endpoint
    short dport = 8888;

    // callbacks
    void on_message(server* s, websocketpp::connection_hdl hdl, message_ptr msg);
};

} // end webauth namespace
namespace\uuuu webauth\uuuu{
结构ws_config:publicWebSocketPP::config::asio{
//从核心配置中提取默认设置
typedefWebSocketPP::config::asio内核;
typedef core::concurrency_type concurrency_type;
typedef core::request_type request_type;
typedef core::response_type response_type;
typedef core::message_type message_type;
typedef core::con_msg_manager_type con_msg_manager_type;
typedef core::endpoint_msg_manager_type endpoint_msg_manager_type;
typedef core::alog_类型alog_类型;
typedef core::elog_类型elog_类型;
类型定义核心::rng_类型rng_类型;
typedef core::endpoint_base endpoint_base;
静态bool const enable_multi-threading=true;
结构传输配置:公共核心::传输配置{
typedef core::concurrency_type concurrency_type;
typedef core::elog_类型elog_类型;
typedef core::alog_类型alog_类型;
typedef core::request_type request_type;
typedef core::response_type response_type;
静态bool const enable_multi-threading=true;
};
typedef websocketpp::transport::asio::endpoint transport_type;
静态常量websocketpp::log::level elog\u level=
websocketpp::log::elevel::none;
静态常量websocketpp::log::level alog_level=
websocketpp::log::alevel::none;
///permessage\u压缩扩展
结构permessage\u deflate\u config{
};
typedef websocketpp::extensions::permessage_deflate::enabled<
permessage_deflate_config>permessage_deflate_type;
};
typedef websocketpp::server;
//使用占位符
使用websocketpp::lib::占位符::\u 1;
使用websocketpp::lib::占位符::\u 2;
使用websocketpp::lib::bind;
//定义消息类型
typedef服务器::message_ptr message_ptr;
//定义属性树(JSON)
使用boost::property_tree::ptree;
使用boost::property_tree::basic_ptree;
类调度器{
公众:
void start();
私人:
服务器调度器;//创建服务器端点
短dport=8888;
//回调
消息无效(服务器*s,websocketpp::连接\u hdl,消息\u ptr msg);
};
}//结束webauth命名空间
但是当我尝试从start()成员函数调用on_message callback时,如下所示:

namespace __webauth__ {

struct ws_config: public websocketpp::config::asio {
    // pull default settings from our core config
    typedef websocketpp::config::asio core;

    typedef core::concurrency_type concurrency_type;
    typedef core::request_type request_type;
    typedef core::response_type response_type;
    typedef core::message_type message_type;
    typedef core::con_msg_manager_type con_msg_manager_type;
    typedef core::endpoint_msg_manager_type endpoint_msg_manager_type;

    typedef core::alog_type alog_type;
    typedef core::elog_type elog_type;
    typedef core::rng_type rng_type;
    typedef core::endpoint_base endpoint_base;

    static bool const enable_multithreading = true;

    struct transport_config: public core::transport_config {
        typedef core::concurrency_type concurrency_type;
        typedef core::elog_type elog_type;
        typedef core::alog_type alog_type;
        typedef core::request_type request_type;
        typedef core::response_type response_type;

        static bool const enable_multithreading = true;
    };

    typedef websocketpp::transport::asio::endpoint<transport_config> transport_type;

    static const websocketpp::log::level elog_level =
            websocketpp::log::elevel::none;
    static const websocketpp::log::level alog_level =
            websocketpp::log::alevel::none;

    /// permessage_compress extension
    struct permessage_deflate_config {
    };

    typedef websocketpp::extensions::permessage_deflate::enabled<
            permessage_deflate_config> permessage_deflate_type;
};

typedef websocketpp::server<ws_config> server;

// use placeholders
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;

// define message type
typedef server::message_ptr message_ptr;

// define property tree (JSON)
using boost::property_tree::ptree;
using boost::property_tree::basic_ptree;

class Dispatcher {
public:
    void start();

private:
    server dispatcher;       // Create a server endpoint
    short dport = 8888;

    // callbacks
    void on_message(server* s, websocketpp::connection_hdl hdl, message_ptr msg);
};

} // end webauth namespace
dispatcher.set_message_处理程序(绑定(&on_message,&dispatcher,:::_1,::_2))

我得到以下错误:
这条线上有多个标记
-从这里开始需要
- ISO C++禁止接受不合格或括号的非静态成员函数的地址,以形成指针。
成员函数。在消息上说“&uu webauth_uuu::Dispatcher::on”[-fppermissive]
-候选人是:
-没有用于调用的匹配函数
'websocketpp::server::set_message_handler(boost::_bi::bind_t)'
我知道我需要通过函数指针正确地调用类方法,但我不知道如何在我创建的类中对on_消息回调进行调用。有人知道如何完成这项任务吗

下面是start()函数:

// ********************
//  Dispatcher (Public)
// ********************

void Dispatcher::start() {
    info("Dispatcher::start");

    try {
        // Total silence
        dispatcher.clear_access_channels(websocketpp::log::alevel::all);
        dispatcher.clear_error_channels(websocketpp::log::alevel::all);

        // Initialize ASIO
        dispatcher.init_asio();
        dispatcher.set_reuse_addr(true);

        // Register our message handler
       dispatcher.set_message_handler(bind(&on_message,&dispatcher,::_1,::_2));

        // Listen on specified port with extended listen backlog
        dispatcher.set_listen_backlog(8192);
        dispatcher.listen(dport);

        // Start the dispatcher accept loop
        dispatcher.start_accept();

        typedef websocketpp::lib::shared_ptr<websocketpp::lib::thread> thread_ptr;
        thread_ptr ts;
        ts = websocketpp::lib::make_shared<websocketpp::lib::thread>(&server::run, &dispatcher);
        ts->join();

    } catch (websocketpp::exception const & e) {
        std::cout << "exception: " << e.what() << std::endl;
    }
}
//********************
//调度员(公共)
// ********************
void调度程序::start(){
信息(“调度器::启动”);
试一试{
//完全沉默
dispatcher.clear_access_通道(websocketpp::log::alevel::all);
dispatcher.clear_error_通道(websocketpp::log::alevel::all);
//初始化ASIO
dispatcher.init_asio();
dispatcher.set\u reuse\u addr(true);
//注册我们的消息处理程序
dispatcher.set_message_处理程序(绑定(&on_message,&dispatcher,:::_1,:::_2));
//使用扩展侦听积压在指定端口上侦听
调度程序。设置\u侦听\u待办事项(8192);
dispatcher.listen(dport);
//启动dispatcher accept循环
dispatcher.start_accept();
typedef websocketpp::lib::shared_ptr thread_ptr;
螺纹接头;
ts=websocketpp::lib::使_共享(&server::run,&dispatcher);
ts->join();
}捕获(websocketpp::异常常量&e){

std::cout回调问题通过正确传递类方法函数指针和对象(this)得到解决:

dispatcher.set_message_handler(bind(&Dispatcher::on_message,this,&dispatcher,::_1,::_2));
您需要正确地传递类方法函数指针(&Dispatcher::on_message)和对象(this