2017-05-25 2 views
0

Consultez le code suivantstd :: fonction std :: bind avec l'ambiguïté de surcharge lambda

class my_class { 
public: 
struct my_struct { 
    int i; 
}; 
std::function<void(my_struct&)> func; 
my_class() { 
    func = std::bind([this](my_struct& s) { s.i = 5; }); 
} 
}; 

Sur VS 2017 Je reçois les erreurs suivantes:

erreur C2440: 'initialisation': ne peut pas convertir 'std :: _ Binder>' à 'std :: function' note: Aucun constructeur n'a pu prendre le type source, ou la résolution de surcharge du constructeur était ambiguë

Des pensées sur ce qui me manque pour résoudre l'ambiguïté?

Répondre

3

Il s'agit de l'erreur de compilation la plus inutile qui soit. Le problème est que vous voulez

func = std::bind([this](my_struct& s) { s.i = 5; }, std::placeholders::_1); 
//             ^^^^^^^^^^^^^^^^^^^^^ 

std::bind(f) signifie « me donner un g tel que g(/* anything */) est f().

Vous devez utiliser des espaces réservés si vous voulez passer des arguments à travers.

(je suppose que votre code réel fait quelque chose de plus compliqué que cela, parce qu'il n'y a pas besoin de bind ou pour capturer this dans le code que vous avez montré.)

+0

merci cela a fonctionné! – schuess

2

std::bind est plus ou moins obsolète dans C++ 11. Utilisez simplement un lambda à la place.

class my_class 
{ 
public: 
    struct my_struct { 
    int i; 
    }; 
    my_class() 
    : func ([](my_struct& s) { s.i = 5; }) {} 
private: 
    std::function<void(my_struct&)> func; 
}; 
+0

Y ou signifie C++ 14. Vous avez toujours besoin de 'std :: bind' pour supporter le déplacement de choses dans le contexte de lambda dans C++ 11 au lieu de copier. – StoryTeller

+0

@StoryTeller En C++ 11 c'est * presque * obsolète (j'ai dit * plus ou moins *). En C++ 14 c'est encore plus (complètement?) Obsolète. – Walter

+0

Je ne pense pas que l'on puisse dire qu'il est obsolète à tout point de vue s'il y a un cas d'utilisation qui l'exige réellement. Mais peut-être que je ne fais que couper les cheveux. Il n'a certainement aucune utilité en C++ 14. – StoryTeller