2017-07-29 1 views
0

Je suis en train de passer par référence à un fil, une variable définie comme:ne peut pas passer par référence à fil

zmq::context_t context(1); 

comme ceci:

t[thread_nbr] = std::thread(worker_routine, (void *)&context, trained_images); 

Cependant, quand je fais que je reçois la erreur suivant:

/usr/include/c++/5/functional:1505:61: error: no type named ‘type’ in ‘class std::result_of<void* (*(void*, std::vector<TrainedImage>))(void*, std::vector<TrainedImage>&)>’ 
    typedef typename result_of<_Callable(_Args...)>::type result_type; 
                 ^
/usr/include/c++/5/functional:1526:9: error: no type named ‘type’ in ‘class std::result_of<void* (*(void*, std::vector<TrainedImage>))(void*, std::vector<TrainedImage>&)>’ 
    _M_invoke(_Index_tuple<_Indices...>) 

Si je tente de faire std::ref() avec elle, je reçois une erreur de fonction supprimée.

Est-ce que quelqu'un sait ce que je peux faire?

+2

ce qui est la signature de 'worker_routine'? – user463035818

+5

[Off Topic] Vous ne devriez vraiment pas avoir besoin de lancer quelque chose à 'void *' quand vous travaillez avec 'std :: thread'. Il est conçu pour fonctionner avec le système de type. – NathanOliver

+1

Pouvez-vous s'il vous plaît essayer de créer un [Exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) et nous montrer? Y compris la déclaration (au moins) de 'worker_routine' et' trained_images'. –

Répondre

2

Le problème semble être l'argument trained_images que votre thread-fonction prend comme argument par référence. Le problème avec ceci est que l'objet std::thread ne peut pas vraiment gérer les références (copie les arguments à la fonction thread, et les références ne peuvent pas être copiées).

La solution est d'utiliser des objets comme wrapper std::ref pour les références:

t[thread_nbr] = std::thread(worker_routine, &context, std::ref(trained_images));