Création d'une mappe d'int sur un pointeur de fonction membre et initialisation dans un initialiseur de constructeur. Comme ceci:Utilisation de la liste d'initialiseurs de la carte dans l'initialiseur de constructeur
class X
{
using STATEFUNC = void(X::*)(int);
public:
X() : m{ { 1, &setState1 } } {}
void setState1(int x) { cout << "state1" << endl; }
void setState2(int x) { cout << "state2" << endl; }
std::map<int, STATEFUNC> m;
};
je dirais que cela est vrai, mais Visual Studio 2017 dit:
Error C2664 'std::map,std::allocator>>::map(std::initializer_list>)': cannot convert argument 1 from 'initializer list' to 'std::initializer_list>'
Error C2276 '&': illegal operation on bound member function expression
Lorsque vous supprimez l'adresse de l'opérateur de la fonction de membre du premier message d'erreur reste le même, mais le deuxième changement à:
Error C3867 'X::setState1': non-standard syntax; use '&' to create a pointer to member
Comment initialize-vous une carte de int pointeur de fonction membre dans une liste d'initialisation du constructeur?
Intéressant. Je ne sais pas pourquoi mais cela nécessite le nom de la classe ici. Espérons que quelqu'un saura pourquoi 'X(): m {{1, & X :: setState1}} {}' fonctionne mais 'X(): m {{1, & setState1}} {}' ne peut pas – NathanOliver
'identifier' ne jamais être utilisé pour prendre l'adresse d'une fonction membre (soit explicitement avec '&' ou par décroissance); vous devez toujours utiliser un identifiant qualifié –