Erreur C ++: la référence à une fonction membre non statique doit être appelée

Almosnow

J'essaie de créer une classe pour résumer certains comportements de base des fonctions de réseau de 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);
    }
};

Le problème avec le code précédemment affiché est que lorsque j'essaie de le compiler, j'obtiens l'erreur suivante:

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);
                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Et cela désigne listen_uv_listen_uv_connection_cbcomme le coupable.

Quelqu'un peut-il m'expliquer pourquoi est-ce une erreur et comment suis-je censé y remédier?

Les signatures uv_listen()et uv_connection_cbsont déclarées comme suit

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);
Slava

Vous ne pouvez pas convertir une fonction membre non statique en un pointeur pour fonctionner même avec la même signature, car techniquement la fonction membre a un paramètre masqué appelé this. Une des solutions est de rendre listen_uv_listen_uv_connection_cbstatique:

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 pour pouvoir appeler une méthode non statique, vous auriez besoin d'un moyen d'obtenir un pointeur vers votre _tcpinstance à partir du paramètre "uv_stream_t * stream". Je suggérerais d'utiliser le pointeur "void * uv_handle_t.data" de ce document http://docs.libuv.org/en/latest/handle.html#c.uv_handle_t

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

Bien sûr, vous devez attribuer un thispointeur à uv_handle_t.datalorsque vous initialisez uv_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
    ...
}

et je déplacerais ce code d'initialisation vers le constructeur.

Vous auriez besoin d'un tel wrapper statique pour chaque rappel que vous allez utiliser avec cette bibliothèque. Avec c ++ 11, vous pouvez probablement utiliser lambda à la place.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Erreur étrange "une référence à une fonction membre non statique doit être appelée"

Erreur: la référence à la fonction membre non statique doit être appelée (2)

Obtenir l'erreur "la référence à la fonction membre non statique doit être appelée"

La référence à une fonction membre non statique doit être appelée

la référence à une fonction membre non statique doit être appelée error

La référence à la fonction membre non statique doit être appelée

Message d'erreur c++17 : "la référence à une fonction membre non statique doit être appelée" lors de l'utilisation d'une macro sur un vecteur

C ++ est-ce que je référence une fonction ou un membre de données? (la référence à une fonction membre non statique doit être appelée)

Fonction modèle paramétrique de non-type, erreur : la référence à la fonction membre non statique doit être appelée

La référence à une fonction membre non statique doit être appelée sur une classe basée sur un modèle

La référence à une fonction membre non statique doit être appelée lors du traitement des rappels à l'intérieur d'une classe

Erreur C ++ Une référence de membre non statique doit être relative à un objet spécifique

J'obtiens une erreur "La référence de membre non statique doit être relative à un objet spécifique" dans un projet DLL C ++

Impossible d'accéder aux objets du jeu "la référence à la fonction membre non statique doit être appelée"

une référence de membre non statique doit être relative à un objet spécifique c ++

C ++ Une référence de membre non statique doit être relative à un objet spécifique

Erreur de mappage: une référence de membre non statique doit être relative à un objet spécifique

Une référence de membre non statique doit être relative à un objet spécifique c++

une référence de membre non statique doit être relative à un objet spécifiqueC/C++(245)

comment une "référence de membre non statique doit être relative à un objet spécifique" peut être résolue en accédant à une fonction différente

Appel d'un objet membre à partir d'un objet, ERREUR: la valeur initiale de la référence à non-const doit être une lvalue

Une référence de membre non statique doit être relative à un objet spécifique

Qt une référence de membre non statique doit être relative à un objet spécifique

déclarer une variable constante dans une structure me provoque cette erreur une référence de membre non statique doit être relative à un objet spécifique

Une référence C++ à une fonction membre non statique est requise

Une erreur de référence de membre non statique dans Array à l'aide de C ++

Erreur fatale : Erreur non détectée : appel à une fonction membre fetch() sur la chaîne

erreur : utilisation non valide d'une fonction membre non statique en c++

Erreur C ++ C2600: impossible de définir une fonction membre spéciale générée par le compilateur (doit d'abord être déclarée dans la classe)

TOP liste

  1. 1

    Filtrer le dataframe basé sur plusieurs colonnes d'un autre dataframe

  2. 2

    Laravel SQLSTATE [HY000] [1049] Base de données inconnue 'previous_db_name'

  3. 3

    Enregistrer le chemin de l'image de la galerie vers la base de données de la salle et l'afficher dans la liste des recycleurs

  4. 4

    Comment envoyer plusieurs variables de la lame au contrôleur

  5. 5

    Comment afficher du texte au milieu de div avec une couleur d'arrière-plan différente?

  6. 6

    Microsoft.WebApplication.targets

  7. 7

    Échec de l'exécution de 'insertBefore' sur 'Node': le paramètre 1 n'est pas de type 'Node'

  8. 8

    System.Data.SqlClient.SqlException: 'Nom de colonne non valide' ApplicationRoleId '.'

  9. 9

    Comment définir du texte dans un QLabel et afficher les caractères '<>'?

  10. 10

    Comment analyser un fichier avec un tableau d'objets JSON en utilisant Node.js?

  11. 11

    Concaténer des variables dans ansible

  12. 12

    Comment centrer un div tout en utilisant la transition et transformer avec l'échelle

  13. 13

    Filtrer les données en fonction des conditions d'une trame de données

  14. 14

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  15. 15

    ESP8266 HADRWARE MINUTERIE, USA pour cocher une macro étrange

  16. 16

    comment afficher un bouton au-dessus d'un autre élément ?

  17. 17

    php ajouter et fusionner des données de deux tables

  18. 18

    Stop jQuery execution after one time execution

  19. 19

    Pourquoi Phantomjs ne fonctionne pas avec ce site ?

  20. 20

    obtenir le nombre de marqueur affiché sur la carte

  21. 21

    Redirection HTTP vers HTTPS dans Java à l'aide de HTTPURLConnection

chaudétiquette

Archive