Bonjour...
Pour information, je viens du monde de C#.
Je suis obligé de programmer en C++ cette fois-ci.
Bon, en C#, j'utilise souvent la classe WebClient... J'ai réussi à créer la même chose avec C++ et Boost.
Maintenant, je veux créer des évènements du type :
-DownloadCompleted
-DownloadFailed
Dans le 1er, je veux passer en argument le buffer contenant les données téléchargées, dans le 2ème un string me donnant la nature de l'erreur...
Donc par exemple ma classe suivante : NetDownload
J'ai repris l'exemple de Boost::Signal2:: Document and Viewer
Alors, quand le téléchargement se passe correctement, j'appelle mSignalDownloadCompleted(buffer); (buffer étant du type boost::asio::streambuf).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class NetDownload { public : typedef boost::signals2::signal<void(boost::asio::streambuf)> TickDownloadCompleted; boost::signals2::connection onDownloadCompleted(const TickDownloadCompleted::slot_type &suscriber); typedef boost::signals2::signal<void(std::string)> TickDownloadFailed; boost::signals2::connection onDownloadFailed(const TickDownloadFailed::slot_type &suscriber); protected: TickDownloadCompleted mSignalDownloadCompleted; TickDownloadFailed mSignalDownloadFailed; }
Quand le téléchargement échoue, j'appelle mSignalDownloadFailed("Erreur");.
Voila pour la classe NetDownload...
J'ai une autre classe qui gère NetDownload, nommée NetClient
Le fichier entête :
Le fichier CPP:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 class NetClient { public : NetClient(); ~NetClient(); void Start(std::string); private: void DownloadCompletet(boost::asio::streambuf); }
Lors de la compilation, Visual Studio me dit un truc incompréhensible pour ma petite tête de DotNet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void NetClient::Start(std::string url) { boost::asio::io_service io_service; NetDownload client(io_service, url); client.onDownloadCompleted(boost::bind(&NetClient:: DownloadCompleted,this, -1)); } void NetCLient:: DownloadCompleted(boost::asio::streambuf buf) { ... }
Je sais que mon erreur vient de là : client.onDownloadCompleted(boost::bind(&NetClient:: DownloadCompleted,this, -1));error C2664: 'void boost::_mfi::mf1<void,Net::NetClient,boost::asio::streambuf>::operator ()(T *,A1) const' : impossible de convertir l'argument 2 de 'int' en 'boost::asio::streambuf' c:\boost_1_56_0_x86\include\boost\bind\bind.hpp
Auriez-vous une quelconque piste à ma soumettre ? Parce que lors de mes essais sans passage d'argument, mon code fonctionne...
Bon, je continue mes recherches.
Merci d'avance...
Davy
Partager