C ++错误:必须调用对非静态成员函数的引用

Almosnow

我正在尝试创建一个类来抽象libuv网络功能的一些基本行为。

#define TCP_BACKLOG 256
class _tcp {
    uv_tcp_t* tcp = NULL;
    public:
    ~_tcp() { delete tcp; }
    void listen_uv_listen_uv_connection_cb(uv_stream_t* stream, int status) {
        printf("NEW CONNECTION\n");
    }
    void listen(const char* host, int port) {
        tcp = new uv_tcp_t();
        uv_tcp_init(uv_default_loop(), tcp);
        sockaddr_in* addr = new sockaddr_in();
        uv_ip4_addr(host, port, addr);
        uv_tcp_bind(tcp, (const sockaddr*)addr, 0);
        delete addr;

        uv_listen((uv_stream_t*)tcp, TCP_BACKLOG, listen_uv_listen_uv_connection_cb);
    }
};

先前显示的代码的问题在于,当我尝试对其进行编译时,出现以下错误:

error: reference to non-static member function must be called
  on: uv_listen((uv_stream_t*)tcp, TCP_BACKLOG, listen_uv_listen_uv_connection_cb);
                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

它指向listen_uv_listen_uv_connection_cb罪魁祸首。

有人可以向我解释,为什么是错误,我应该如何解决?

uv_listen()uv_connection_cb签名的声明如下

UV_EXTERN int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb);
typedef void (*uv_connection_cb)(uv_stream_t* server, int status);
斯拉瓦

您不能将非静态成员函数转换为具有相同签名的函数指针,因为从技术上讲,成员函数具有名为的隐藏参数this解决方案之一是使listen_uv_listen_uv_connection_cb静态:

class _tcp {
    uv_tcp_t* tcp = NULL;
    public:
    ~_tcp() { delete tcp; }
    static void listen_uv_listen_uv_connection_cb(uv_stream_t* stream, int status) {
        printf("NEW CONNECTION\n");
    }
    void listen(const char* host, int port) {
        tcp = new uv_tcp_t();
        uv_tcp_init(uv_default_loop(), tcp);
        sockaddr_in* addr = new sockaddr_in();
        uv_ip4_addr(host, port, addr);
        uv_tcp_bind(tcp, (const sockaddr*)addr, 0);
        delete addr;

        uv_listen((uv_stream_t*)tcp, TCP_BACKLOG, 
                   &_tcp::listen_uv_listen_uv_connection_cb);
    }
};

PS能够调用非静态方法,您将需要一种方法来_tcp从“ uv_stream_t * stream”参数获取指向您实例的指针我建议使用此文档http://docs.libuv.org/en/latest/handle.html#c.uv_handle_t的“ void * uv_handle_t.data”指针

static void listen_uv_listen_uv_connection_cb(uv_stream_t* stream, int status) {
    _tcp *tcp = static_cast<_tcp *>( stream->data );
    tcp->regularMethod();
}

当然,您应该在初始化时分配this指向的指针uv_handle_t.datauv_tcp_t *

void listen(const char* host, int port) {
    tcp = new uv_tcp_t();
    uv_tcp_init(uv_default_loop(), tcp);
    tcp->data = this; // do not forget it
    ...
}

然后将初始化代码移至构造函数。

对于要与此库一起使用的每个回调,您都需要这样的静态包装器。在c ++ 11中,您可能可以改用lambda。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我使用C ++引用函数或数据成员吗?(必须调用对非静态成员函数的引用)

来自分类Dev

必须调用非静态成员函数的引用错误

来自分类Dev

必须调用对非静态成员函数的引用

来自分类Dev

必须调用对非静态成员函数的引用

来自分类Dev

我在DLL项目C ++中收到“非静态成员引用必须相对于特定对象”错误

来自分类Dev

C ++使用模板类调用非静态成员函数

来自分类Dev

调用推入优先级队列时出现错误“必须调用对非静态成员函数的引用”

来自分类Dev

错误:非静态成员函数 C++ 的无效使用

来自分类Dev

错误:在 C++ 中无效使用非静态成员函数

来自分类Dev

Qt:必须调用对非静态成员函数的引用

来自分类Dev

非静态成员引用必须相对于特定对象c ++

来自分类Dev

C ++非静态成员引用必须相对于特定对象

来自分类Dev

非静态成员引用必须相对于特定对象c ++

来自分类Dev

C ++非静态成员函数的开销

来自分类Dev

必须调用非静态成员函数

来自分类Dev

C ++静态成员解构函数多次调用

来自分类Dev

C#如何在非静态成员函数上调用Action?

来自分类Dev

在没有对象参数的情况下调用非静态成员函数,C ++节点

来自分类Dev

C ++中的静态成员函数错误

来自分类Dev

学习C ++并遇到早期示例错误(非静态数据成员之前需要构造函数)

来自分类Dev

无法访问游戏对象“必须调用对非静态成员函数的引用”

来自分类Dev

以函数为参数的C ++错误,对非const的引用的初始值必须为左值

来自分类Dev

C ++函数/调用何时应为静态/非静态?

来自分类Dev

C ++将指针传递给非静态成员函数

来自分类Dev

C ++:如何返回指向非静态成员函数的指针?

来自分类Dev

非静态成员函数c++线程linux的无效使用

来自分类Dev

Arduino错误(C ++):无效使用非静态数据成员

来自分类Dev

没有调用C ++模板化静态成员构造函数

来自分类Dev

如何将(非静态成员函数的)C ++函数指针传递给预定义的C函数?

Related 相关文章

  1. 1

    我使用C ++引用函数或数据成员吗?(必须调用对非静态成员函数的引用)

  2. 2

    必须调用非静态成员函数的引用错误

  3. 3

    必须调用对非静态成员函数的引用

  4. 4

    必须调用对非静态成员函数的引用

  5. 5

    我在DLL项目C ++中收到“非静态成员引用必须相对于特定对象”错误

  6. 6

    C ++使用模板类调用非静态成员函数

  7. 7

    调用推入优先级队列时出现错误“必须调用对非静态成员函数的引用”

  8. 8

    错误:非静态成员函数 C++ 的无效使用

  9. 9

    错误:在 C++ 中无效使用非静态成员函数

  10. 10

    Qt:必须调用对非静态成员函数的引用

  11. 11

    非静态成员引用必须相对于特定对象c ++

  12. 12

    C ++非静态成员引用必须相对于特定对象

  13. 13

    非静态成员引用必须相对于特定对象c ++

  14. 14

    C ++非静态成员函数的开销

  15. 15

    必须调用非静态成员函数

  16. 16

    C ++静态成员解构函数多次调用

  17. 17

    C#如何在非静态成员函数上调用Action?

  18. 18

    在没有对象参数的情况下调用非静态成员函数,C ++节点

  19. 19

    C ++中的静态成员函数错误

  20. 20

    学习C ++并遇到早期示例错误(非静态数据成员之前需要构造函数)

  21. 21

    无法访问游戏对象“必须调用对非静态成员函数的引用”

  22. 22

    以函数为参数的C ++错误,对非const的引用的初始值必须为左值

  23. 23

    C ++函数/调用何时应为静态/非静态?

  24. 24

    C ++将指针传递给非静态成员函数

  25. 25

    C ++:如何返回指向非静态成员函数的指针?

  26. 26

    非静态成员函数c++线程linux的无效使用

  27. 27

    Arduino错误(C ++):无效使用非静态数据成员

  28. 28

    没有调用C ++模板化静态成员构造函数

  29. 29

    如何将(非静态成员函数的)C ++函数指针传递给预定义的C函数?

热门标签

归档