2017-09-14 6 views
-1

J'ai la configuration suivante:Impossible de convertir la liste initialiseur ci-joint brace pour std :: paire en std :: carte

typedef std::function<void()> reaction; 

class Node 
{ 
    public: 
    ... 

    private: 
    void connect(); 
    void receive(); 

    private: 
    const std::map<std::pair<Status, Event>, reaction> TransTable = { 
     {{DISCONNECTED, CONNECT}, &Node::connect}, 
     {{CONNECTING, RECEIVE}, &Node::receive} 
    }; 
} 

Mais je suis toujours l'erreur:

error: could not convert from <brace-enclosed initializer list> to const std::map<std::pair<Status, Event>, std::function<void()> > 

Quel est le problème avec ma liste d'initalizer?

+0

ce qui est « réaction »? ce n'est pas défini, donc l'erreur vient de ça. –

+0

Désolé de l'avoir oublié – Reza

Répondre

3

Votre question manque un MCVE, cependant le message d'erreur est assez clair: reaction semble être un typedef pour std::function<void()>. Un pointeur de fonction membre tel que &Node::connect ne peut pas être converti en std::function<void()>, car ce dernier n'a aucun type de paramètre this sur lequel appeler réellement la fonction.

Vous pouvez cependant utiliser lambdas pour capturer et stocker l'instance qui est actuellement en cours d'initialisation à ce membre TransTable:

const std::map<std::pair<Status, Event>, reaction> TransTable = { 
    {{DISCONNECTED, CONNECT}, [this] { connect(); }}, 
    {{CONNECTING, RECEIVE}, [this] { receive(); }} 
};