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

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;
}
Alors, quand le téléchargement se passe correctement, j'appelle mSignalDownloadCompleted(buffer); (buffer étant du type boost::asio::streambuf).
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 :
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);
}
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
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)
{
...
}
Lors de la compilation, Visual Studio me dit un truc incompréhensible pour ma petite tête de DotNet :
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
Je sais que mon erreur vient de là : client.onDownloadCompleted(boost::bind(&NetClient:: DownloadCompleted,this, -1));

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